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!
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.Tetapan
NEW.
hanya digunakan pada baris yang sepadan di mana pencetus dijana.Badan pencetus memproses satu baris pada satu masa, ditunjukkan denganUNTUK 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 pencetusSEBELUM
. Setelah pencetusAFTER
dijalankan, sudah terlambat untuk menukar sebarang nilai.