MySQL Trigger untuk Mengemas kini Baris Sedia Ada dalam Jadual Yang Sama Selepas Sisip
Pernyataan Masalah
Bila baris baharu dimasukkan ke dalam jadual ACCOUNTS, baris sedia ada yang sepadan dalam jadual yang sama dengan pk sama dengan lajur edit_on pada baris yang baru dimasukkan perlu dikemas kini dengan menetapkan lajur statusnya kepada 'E'. Walau bagaimanapun, ralat berlaku apabila mencuba kemas kini ini dalam pencetus, menyatakan bahawa jadual sudah digunakan oleh pernyataan yang menggunakan pencetus.
Penyelesaian
Disebabkan sekatan mengemas kini jadual dalam pencetus yang sudah diubah suai oleh pernyataan pencetus, pendekatan alternatif ialah diperlukan.
Prosedur Tersimpan
Buat prosedur tersimpan yang mengendalikan kedua-dua operasi sisipan dan kemas kini dalam satu transaksi. Langkah-langkah yang terlibat adalah seperti berikut:
Sintaks SQL
CREATE PROCEDURE setEditStatus(IN NEW_pk INT, IN NEW_edit_on INT) BEGIN /* Insert new row into ACCOUNTS table */ INSERT INTO ACCOUNTS (pk, user_id, edit_on, status) VALUES (NEW_pk, /* User ID */, NEW_edit_on, 'A'); /* Update existing row */ UPDATE ACCOUNTS SET status = 'E' WHERE pk = NEW_edit_on; /* Commit changes */ COMMIT; END;
Pencetus
Ubah suai pencetus untuk memanggil prosedur tersimpan sebaliknya mencuba kemas kini secara terus.
DELIMITER $$ DROP TRIGGER IF EXISTS `setEditStatus`$$ CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS FOR EACH ROW BEGIN CALL setEditStatus(NEW.pk, NEW.edit_on); END$$ DELIMITER ;
Penyelesaian ini membolehkan kemas kini yang diingini untuk dilakukan tanpa melanggar sekatan mengemas kini jadual yang sama dalam pencetus.
Atas ialah kandungan terperinci Bagaimana untuk Mengemas kini Baris Sedia Ada dalam MySQL Selepas Sisipan Tanpa Penguncian Pencetus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!