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 !
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.Paramètres
NEW.
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'actionFOR 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éclencheurAVANT
. Une fois le déclencheurAFTER
exécuté, il est trop tard pour modifier les valeurs.