Cabaran biasa timbul apabila cuba mengemas kini jadual yang sama dalam pencetusnya sendiri selepas kemas kini. Ini menjadi jelas apabila pencetus direka bentuk untuk mengubah suai lajur tertentu dalam jadual berdasarkan perubahan kepada lajur lain dalam baris yang sama.
Pertimbangkan senario berikut, di mana kami ingin mengemas kini lajur "votes_total" dalam jadual "products_score" setiap kali skor adalah diubah suai:
CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score FOR EACH ROW UPDATE products_score SET products_score.votes_total = (SELECT (votes_1 + votes_2 + votes_3 + votes_4 + votes_5) FROM products_score WHERE id = new.id)
Walau bagaimanapun, semasa melaksanakan kemas kini pada jadual, kami menghadapi ralat:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Ralat ini disebabkan oleh rujukan bulat dalam logik pencetus. Kenyataan kemas kini cuba mengubah suai lajur "votes_total", yang pencetus juga bergantung pada pengiraan jumlah baharu.
Untuk memintas isu ini, kami boleh mengubah suai pencetus kepada laksanakan sebelum kemas kini dan bukannya selepas:
CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score FOR EACH ROW BEGIN SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5 END ;
Dalam pencetus yang diubah suai ini, kami mengira yang baharu nilai "votes_total" dan tetapkan pada objek baris "baharu" sebelum kemas kini sebenar berlaku. Ini membolehkan kenyataan kemas kini diteruskan tanpa menghadapi isu rujukan pekeliling.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat Kemas Kini Jadual Terinduksi Trigger MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!