Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Mengemas kini Jadual Di Dalam Pencetus Yang Mengubah Suai Jadual Yang Sama dalam MySQL?

Mengapa Saya Tidak Boleh Mengemas kini Jadual Di Dalam Pencetus Yang Mengubah Suai Jadual Yang Sama dalam MySQL?

Patricia Arquette
Patricia Arquetteasal
2024-11-08 22:52:02718semak imbas

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

Pencetus Penyelesaian Masalah: Ketidakserasian dengan Pengubahsuaian Jadual

Dalam MySQL, pencetus ialah alat berkuasa yang digunakan untuk mengautomasikan tindakan pangkalan data berdasarkan peristiwa tertentu. Walau bagaimanapun, apabila pencetus menghadapi masalah dalam pelaksanaan, penyelesaian masalah adalah penting. Artikel ini menangani ralat biasa yang dihadapi apabila pencetus MySQL gagal berfungsi.

Penerangan Isu:

Seorang pengguna melaporkan bahawa pencetus mereka tidak mengemas kini lajur tertentu (PTS ) apabila lajur playing_games yang sepadan dalam pos_table berubah. Walaupun pertanyaan berfungsi secara manual, pencetus gagal mencetuskan kemas kini.

Struktur Pencetus:

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END

Ralat Ditemui:

Apabila cuba mengedit lajur playing_games secara manual, pengguna menerima ralat yang menyatakan: "Tidak dapat mengemas kini jadual pos_table dalam fungsi/pencetus tersimpan kerana ia telah digunakan oleh pernyataan yang menggunakan fungsi/pencetus tersimpan ini".

Penyelesaian:

Isu berpunca daripada fakta bahawa pencetus cuba mengubah suai jadual yang sama (pos_table) yang dirujuk dalam peristiwa pencetus (kemas kini bermain_permainan). Seperti yang didokumenkan dalam Sekatan Program Tersimpan MySQL, fungsi atau pencetus yang disimpan tidak boleh mengubah suai jadual yang telah digunakan oleh penyataan pemanggilan.

Penyelesaian Alternatif:

Untuk mengelakkan isu ini, adalah disyorkan untuk menggunakan pencetus SEBELUM INSERT. Dalam kes ini, pencetus boleh diubah suai seperti berikut:

CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table`
FOR EACH ROW BEGIN
    SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1));
END

Pertimbangan Tambahan:

Selain ralat yang dihadapi, artikel itu juga menyerlahkan isu dengan menyimpan lajur yang dikira seperti PTS. Memandangkan ia boleh dikira dengan mudah daripada lajur lain semasa paparan, lajur mungkin lebih cekap dan kurang terdedah kepada ralat untuk mengelak daripada menyimpannya sebagai lajur berasingan.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengemas kini Jadual Di Dalam Pencetus Yang Mengubah Suai Jadual Yang Sama dalam MySQL?. 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