Rumah >pangkalan data >tutorial mysql >Mengapa Saya Tidak Boleh Mengemas kini Jadual Dalam Fungsi atau Pencetus Tersimpan MySQL?

Mengapa Saya Tidak Boleh Mengemas kini Jadual Dalam Fungsi atau Pencetus Tersimpan MySQL?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 00:05:20820semak imbas

Why Can't I Update a Table Within a MySQL Stored Function or Trigger?

Ralat MySQL: Tidak Dapat Mengemas kini Jadual dalam Fungsi/Pencetus Tersimpan

Soalan:

Apabila cuba memasukkan baris baharu ke dalam jadual MySQL menggunakan pencetus, ralat berikut berlaku:

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

Jawapan:

Ralat ini ditemui apabila pencetus INSERT cuba mengubah suai jadual yang memanggilnya. MySQL melarang tingkah laku ini atas dua sebab utama:

  • Konflik Mengunci: INSERT mungkin melakukan operasi mengunci, yang boleh menyebabkan kebuntuan jika pencetus juga cuba mengunci jadual.
  • Rekursi Infinite: Jika pencetus mengemas kini baris dalam baris yang sama jadual, ia boleh menyebabkan pencetus yang sama dicetuskan selama-lamanya, mengakibatkan gelung tak terhingga.

Untuk menyelesaikan ralat ini, pertimbangkan untuk menggunakan pendekatan berikut:

  • Mengakses Nilai Baharu: Daripada mengubah suai jadual dalam pencetus, gunakan NEW.fieldname untuk mengakses nilai yang baru dimasukkan dan tetapkan medan lain dengan sewajarnya.
  • Pengubahsuaian Pra-Sisipan: Gunakan pencetus SEBELUM INSERT untuk mengubah suai nilai sebelum ia dimasukkan ke dalam jadual. Ini mengelakkan isu rekursi tak terhingga.

Sebagai contoh, untuk mencipta medan nama pendek daripada dua aksara pertama nama penuh, pencetus SEBELUM INSERT berikut boleh digunakan:

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

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengemas kini Jadual Dalam Fungsi atau Pencetus Tersimpan 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