MySQL: Tidak dapat mengemas kini 'pesanan' jadual dalam fungsi/pencetus tersimpan kerana ia sudah digunakan oleh pernyataan yang memanggil fungsi/pencetus tersimpan ini
P粉282627613
P粉282627613 2024-02-04 11:46:04
0
1
590

Saya mempunyai sifat yang dipanggil orders 的表。在我们收到资金之前, payment_date dalam pangkalan data MySQL iaitu Null, pada ketika itu ia mengemas kini kepada satu tarikh. Sebaik sahaja atribut payment_date dikemas kini, atribut order_state dikemas kini (secara manual!) 1 atau 2 kepada nilai 3.

Saya mahu mencipta cetus untuk mengautomasikan proses ini. Inilah percubaan saya:

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 ;

Apabila saya memanggilnya, saya mendapat mesej ralat berikut:

[HY000][1442] 无法更新存储函数/触发器中的表“orders”,因为它已被调用此存储函数/触发器的语句使用。[HY000][1442] Tidak dapat mengemas kini 'pesanan' jadual dalam fungsi/pencetus tersimpan kerana ia sudah digunakan oleh pernyataan yang memanggil fungsi/pencetus tersimpan ini.

Memandangkan ini mungkin situasi terkunci (atau risiko gelung tak terhingga), saya menukar pencetus kepada BEFORE UPDATESEBELUM KEMASKINI. Walau bagaimanapun, saya menerima mesej ralat yang sama.

Bagaimana saya boleh menyelesaikan masalah ini?

Terima kasih!

P粉282627613
P粉282627613

membalas semua(1)
P粉724737511

Baiklah, memandangkan anda telah mengulas di atas bahawa anda hanya perlu mengemas kini baris yang menjana pencetus, anda boleh melakukan ini tanpa menggunakan UPDATE dalam badan pencetus.

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 ;

TetapanNEW. hanya digunakan pada baris yang sepadan di mana pencetus dijana.

Badan pencetus memproses satu baris pada satu masa, ditunjukkan dengan UNTUK SETIAP BARIS. Jadi jika tindakan FOR EACH ROW 指示。因此,如果生成此触发器的 UPDATE yang menjana pencetus ini melibatkan berbilang baris, satu baris akan diproses pada satu masa.

Menukar sebarang nilai NEW. 的任何值需要使用 BEFORE 触发器。一旦 AFTER memerlukan penggunaan pencetus SEBELUM. Setelah pencetus AFTER dijalankan, sudah terlambat untuk menukar sebarang nilai.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan