Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengemas kini Baris Sedia Ada dalam MySQL Selepas Sisipan Tanpa Penguncian Pencetus?

Bagaimana untuk Mengemas kini Baris Sedia Ada dalam MySQL Selepas Sisipan Tanpa Penguncian Pencetus?

Patricia Arquette
Patricia Arquetteasal
2024-12-13 00:28:09803semak imbas

How to Update an Existing Row in MySQL After an Insert Without Trigger Locking?

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:

  1. Masukkan baris baharu ke dalam jadual AKAUN.
  2. Kemas kini baris sedia ada yang pk sepadan dengan lajur edit_on pada baris yang baru dimasukkan, tetapkan status lajur ke 'E'.
  3. Serahkan transaksi untuk memuktamadkan perubahan.

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!

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