Rumah >pangkalan data >tutorial mysql >Mengapa MySQL Menyekat Pengubahsuaian Jadual dalam Fungsi dan Pencetus Tersimpan?

Mengapa MySQL Menyekat Pengubahsuaian Jadual dalam Fungsi dan Pencetus Tersimpan?

Barbara Streisand
Barbara Streisandasal
2024-12-07 13:16:18283semak imbas

Why Does MySQL Block Table Modification in Stored Functions and Triggers?

Ralat MySQL Stored/Pencetus: Pengubahsuaian Jadual Disekat

Apabila melaksanakan fungsi tersimpan atau pencetus dalam MySQL, anda mungkin menghadapi ralat:

Error: Can't update table 'brandnames' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Ralat ini berlaku apabila cuba mengemas kini jadual dari dalam fungsi atau pencetus yang disimpan, yang dilarang kerana kemungkinan kebuntuan atau panggilan rekursif tak terhingga.

Pencetus INSERT, seperti yang disediakan:

CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`
FOR EACH ROW UPDATE brandnames
SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )

cuba mengemas kini jadual nama jenama semasa operasi INSERT masih aktif. MySQL menghalang perkara ini untuk mengekalkan integriti data dan mengelakkan kemungkinan ralat.

Untuk menyelesaikan isu ini, pertimbangkan untuk menggunakan kaedah berikut:

  • Mengakses Nilai Baharu: Gunakan BARU .fieldname untuk mengakses nilai yang ditetapkan semasa operasi INSERT. Ini membolehkan anda mengubah suai nilai terbitan tanpa menjejaskan jadual.
  • Menggunakan Sebelum Pencetus: Jika boleh, alihkan logik pengubahsuaian jadual kepada pencetus SEBELUM INSERT. Ini membolehkan anda menetapkan nilai terbitan sebelum INSERT selesai, mengelakkan ralat.

Sebagai contoh, pencetus berikut akan mengemas kini lajur small_name berdasarkan nilai dalam lajur full_name:

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.small_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END

Atas ialah kandungan terperinci Mengapa MySQL Menyekat Pengubahsuaian Jadual dalam Fungsi dan Pencetus Tersimpan?. 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