Rumah > Soal Jawab > teks badan
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 code> dikemas kini, atribut
order_state code> 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 UPDATE
SEBELUM KEMASKINI. Walau bagaimanapun, saya menerima mesej ralat yang sama.
Bagaimana saya boleh menyelesaikan masalah ini?
Terima kasih!
P粉7247375112024-02-05 10:14:31
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 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.