Maison >base de données >tutoriel mysql >Comment puis-je mettre à jour la même table après une insertion sans erreur de déclenchement ?

Comment puis-je mettre à jour la même table après une insertion sans erreur de déclenchement ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-10 22:22:10752parcourir

How Can I Update the Same Table After an Insert Without Trigger Errors?

Déclencheur pour la mise à jour de la même table après l'insertion : une approche alternative

Aperçu du problème

Vous chercher à implémenter un déclencheur sur la table ACCOUNTS qui met à jour une colonne dans la même table en fonction de la valeur edit_on d'une ligne nouvellement insérée. Cependant, vous rencontrez une erreur en raison de la restriction empêchant la mise à jour de la même table dans un déclencheur qui l'a invoqué.

Solution alternative : procédure stockée

Pour contourner cette limitation, une procédure stockée peut être utilisée pour effectuer à la fois les opérations d'insertion et de mise à jour au sein d'une seule transaction. Cette approche permet une validation manuelle des modifications, permettant ainsi les mises à jour souhaitées.

Mise en œuvre d'une procédure stockée

Voici un exemple de procédure stockée qui atteint votre objectif :

DELIMITER $$
CREATE PROCEDURE InsertAndEditStatus(IN new_pk BIGINT)
BEGIN
  -- Insert new row into ACCOUNTS
  INSERT INTO ACCOUNTS (pk, user_id, edit_on, status)
  VALUES (new_pk, /* user_id */, NULL, 'A');
  
  -- Update existing row in ACCOUNTS
  UPDATE ACCOUNTS SET status='E' WHERE pk = NEW.edit_on;
  
  -- Commit transaction
  COMMIT;
END$$
DELIMITER ;

Utilisation

Pour utiliser cette procédure stockée, appelez-la avec la clé primaire du ligne nouvellement insérée comme argument :

CALL InsertAndEditStatus(2147483726);

Cette procédure insérera une nouvelle ligne avec la clé primaire spécifiée et les valeurs par défaut, puis mettra à jour la ligne existante référencée par la colonne edit_on dans la ligne nouvellement insérée pour indiquer que il a été édité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn