recherche

Maison  >  Questions et réponses  >  le corps du texte

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é

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粉282627613P粉282627613294 Il y a quelques jours570

répondre à tous(1)je répondrai

  • P粉724737511

    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.

    répondre
    0
  • Annulerrépondre