MySQL: Die Tabellenreihenfolge in der gespeicherten Funktion/dem gespeicherten Trigger kann nicht aktualisiert werden, da sie bereits von einer Anweisung verwendet wird, die diese gespeicherte Funktion/diesen gespeicherten Trigger aufruft
P粉282627613
P粉282627613 2024-02-04 11:46:04
0
1
588

Ich habe eine Eigenschaft namens orders 的表。在我们收到资金之前, payment_date in einer MySQL-Datenbank, die Null ist und an diesem Punkt auf ein Datum aktualisiert wird. Sobald das Attribut payment_date aktualisiert ist, wird das Attribut order_state (manuell!) 1 oder 2 auf den Wert 3 aktualisiert.

Ich möchte einen Trigger erstellen, um diesen Prozess zu automatisieren. Hier ist mein Versuch:

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 ;

Beim Aufruf erhalte ich folgende Fehlermeldung:

[HY000][1442] 无法更新存储函数/触发器中的表“orders”,因为它已被调用此存储函数/触发器的语句使用。[HY000][1442] Tabelle „Bestellungen“ in der gespeicherten Funktion/dem gespeicherten Trigger kann nicht aktualisiert werden, da sie bereits von einer Anweisung verwendet wird, die diese gespeicherte Funktion/diesen gespeicherten Trigger aufruft.

In Anbetracht der Tatsache, dass es sich hier möglicherweise um eine Blockierungssituation handelt (oder das Risiko einer Endlosschleife besteht), habe ich den Auslöser auf BEFORE UPDATEBEFORE UPDATE geändert. Ich habe jedoch die gleiche Fehlermeldung erhalten.

Wie kann ich dieses Problem lösen?

Danke!

P粉282627613
P粉282627613

Antworte allen(1)
P粉724737511

好的,鉴于您在上面评论过,您只需要更新生成触发器的行,您可以在触发器主体中不使用 UPDATE 的情况下完成此操作。

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 ;

设置NEW.仅适用于生成触发器的相应行。

触发器主体一次处理一行,由 FOR EACH ROW 指示。因此,如果生成此触发器的 UPDATE 操作涉及多行,则每次将处理一行。

更改 NEW. 的任何值需要使用 BEFORE 触发器。一旦 AFTER 触发器运行,再更改任何值都为时已晚。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage