MySQL : Impossible de mettre à jour la table « ordre » dans la fonction/le déclencheur stocké car elle est déjà utilisée par une instruction qui appelle cette fonction/ce déclencheur stocké
P粉282627613
P粉282627613 2024-02-04 11:46:04
0
1
589

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 mis à jour, l'attribut order_state 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 UPDATEAVANT LA MISE À JOUR. Cependant, j'ai reçu le même message d'erreur.

Comment puis-je résoudre ce problème ?

Merci !

P粉282627613
P粉282627613

répondre à tous(1)
P粉724737511

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal