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!