Maison > Questions et réponses > le corps du texte
J'ai une propriété appelée orders
的表。在我们收到资金之前, payment_date
dans une base de données MySQL qui est Null, à quel point elle est mise à jour à une date. Une fois l'attribut payment_date code> mis à jour, l'attribut
order_state code> est mis à jour (manuellement !) 1 ou 2 à la valeur 3.
Je souhaite créer un trigger pour automatiser ce processus. Voici ma tentative :
DELIMITER $$ CREATE TRIGGER update_order_state AFTER UPDATE ON orders FOR EACH ROW BEGIN IF ( NEW.payment_date IS NOT NULL AND NEW.order_state IN (1, 2) ) THEN UPDATE orders SET order_state = 3 WHERE NEW.payment_date IS NOT NULL and NEW.order_state IN (1, 2); END IF; END $$ DELIMITER ;
Lorsque je l'appelle, j'obtiens le message d'erreur suivant :
[HY000][1442] 无法更新存储函数/触发器中的表“orders”,因为它已被调用此存储函数/触发器的语句使用。
[HY000][1442] Impossible de mettre à jour la table « commandes » dans la fonction/déclencheur stocké car elle est déjà utilisée par une instruction qui appelle cette fonction/déclencheur stocké.
Considérant qu'il pourrait s'agir d'une situation de verrouillage (ou d'un risque de boucle infinie), j'ai changé le déclencheur en BEFORE UPDATE
AVANT LA MISE À JOUR. Cependant, j'ai reçu le même message d'erreur.
Comment puis-je résoudre ce problème ?
Merci !
P粉7247375112024-02-05 10:14:31
D'accord, étant donné que vous avez commenté ci-dessus selon lequel il vous suffit de mettre à jour la ligne qui génère le déclencheur, vous pouvez le faire sans utiliser UPDATE
dans le corps du déclencheur.
DELIMITER $$ CREATE TRIGGER update_order_state BEFORE UPDATE ON orders FOR EACH ROW BEGIN IF ( NEW.payment_date IS NOT NULL AND NEW.order_state IN (1, 2) ) THEN SET NEW.order_state = 3; END IF; END $$ DELIMITER ;
ParamètresNEW.
s'appliquent uniquement à la ligne correspondante où le déclencheur a été généré.
Le corps du déclencheur traite une ligne à la fois, indiquée par POUR CHAQUE LIGNE
. Ainsi, si l'action FOR EACH ROW
指示。因此,如果生成此触发器的 UPDATE
qui génère ce déclencheur implique plusieurs lignes, une ligne sera traitée à la fois.
La modification d'une valeur de NEW.
的任何值需要使用 BEFORE
触发器。一旦 AFTER
nécessite l'utilisation d'un déclencheur AVANT
. Une fois le déclencheur AFTER
exécuté, il est trop tard pour modifier les valeurs.