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

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

Barbara Streisand
Lepaskan: 2024-12-07 11:30:13
asal
789 orang telah melayarinya

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

Ralat MySQL: Kemas Kini Dilarang Dalam Fungsi/Pencetus Tersimpan

Apabila cuba mengemas kini jadual dalam fungsi atau pencetus yang disimpan MySQL, anda boleh 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.
Salin selepas log masuk

Memahami Ralat

Ralat ini berpunca daripada sekatan dalam MySQL yang melarang mengubah suai jadual semasa pencetus INSERT sedang dilaksanakan. Pengubahsuaian sedemikian berpotensi membawa kepada kebuntuan atau gelung rekursif tak terhingga.

Mengelakkan Ralat

Untuk mengelakkan ralat ini, pertimbangkan pendekatan berikut:

  • Gunakan BARU dan LAMA Medan:

    • Akses nilai baharu dalam pencetus menggunakan sintaks NEW.fieldname.
    • Akses nilai lama dalam pencetus menggunakan sintaks OLD.fieldname (jika melakukan KEMASKINI).
  • Ubah suai Pencetus Konteks:

    • Tukar jenis pencetus daripada SELEPAS INSERT kepada SEBELUM INSERT.
    • Alihkan kod pengubahsuaian jadual di luar fungsi atau pencetus yang disimpan.

Contoh Penggunaan SEBELUM INSERT Pencetus:

Andaikan anda mempunyai medan_nama_jenama penuh dan perlu mencipta medan short_name yang mengandungi dua huruf pertama dalam huruf besar:

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

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mengemas kini Jadual Di Dalam Fungsi atau Pencetus Tersimpan MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan