Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menyelesaikan Ralat Kemas Kini Jadual Terinduksi Trigger MySQL?

Bagaimana untuk Menyelesaikan Ralat Kemas Kini Jadual Terinduksi Trigger MySQL?

DDD
Lepaskan: 2024-12-26 22:44:13
asal
216 orang telah melayarinya

How to Resolve the MySQL Trigger-Induced Table Update Error?

Dilema Kemas Kini Jadual Tercetus Pencetus

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.

Contoh: Mengira Jumlah Lajur

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

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

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.

Menyelesaikan Dilema

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan