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
Lepaskan: 2024-12-23 03:03:33
asal
214 orang telah melayarinya

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.
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan