Rumah >pangkalan data >tutorial mysql >Mengapa Mengemas kini Jadual Di Dalam Pencetus Menyebabkan Ralat #1442, dan Bagaimana Ini Boleh Diselesaikan?

Mengapa Mengemas kini Jadual Di Dalam Pencetus Menyebabkan Ralat #1442, dan Bagaimana Ini Boleh Diselesaikan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-23 03:03:33247semak imbas

Why Does Updating a Table Inside a Trigger Cause Error #1442, and How Can This Be Solved?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn