Perangkap Pencetus: Mengemas kini Jadual yang Dirujuk oleh Pencetus
Mengemas kini jadual yang sama dalam pencetus boleh membawa kepada isu. Satu contoh sedemikian dibentangkan apabila percubaan dibuat untuk mengemas kini jadual products_score menggunakan pencetus yang dilaksanakan selepas kemas kini.
Pencetus, seperti yang ditunjukkan dalam kod yang disediakan, cuba mengira dan mengemas kini lajur_jumlah undi berdasarkan nilai lajur lain (undi_1, undian_2, ..., undian_5) dalam jadual skor_produk yang sama. Walau bagaimanapun, apabila kemas kini ini dicetuskan, ralat berlaku:
#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Penyelesaian: Menggunakan Pencetus SEBELUM
Untuk menyelesaikan masalah ini, pencetus mesti diubah suai kepada laksanakan sebelum kemas kini baris, bukan selepas. Dengan melaksanakan sebelum kemas kini, pencetus boleh mengakses dan mengubah suai nilai baharu yang diberikan pada lajur_jumlah_undi.
Pencetus yang disemak menggunakan klausa SEBELUM kemas kini adalah seperti berikut:
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;
Dengan pengubahsuaian ini, pencetus berjaya mengira dan mengemas kini lajur_jumlah undi sebelum kemas kini baris sebenar berlaku, menyelesaikan ralat dan membenarkan kefungsian yang diingini.
Atas ialah kandungan terperinci Mengapa Mengemas kini Jadual Di Dalam Pencetus Menyebabkan Ralat #1442, dan Bagaimana Ini Boleh Diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!