Pemicu untuk UPDATE setelah UPDATE?


13

Saya ingin membuat pemicu untuk mencatat waktu setiap pembaruan sebagai:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END

Masalahnya adalah ketika pemicu ini mencoba memperbarui updatedkolom, itu juga merupakan peristiwa pembaruan lain, yang menjalankan pemicu. Ini akan membuat loop tak terbatas, yang tidak berfungsi.

Bagaimana saya bisa menyimpan waktu pembaruan di kolom yang sesuai?

Saya ingin menggunakan pemicu karena ada banyak kolom di tabel. Jika saya mencoba mengatur waktu pembaruan secara manual, saya perlu memodifikasi banyak pertanyaan.

Jawaban:


17

Gunakan BEFOREpemicu, dan setel updatedkolom yang menetapkan nilai NEW.updated(ini akan menjadi tugas sederhana, bukan sebuah UPDATE). Dengan cara ini Anda tidak akan memicu tambahan UPDATE.

Tubuh pemicu Anda akan terlihat seperti

SET NEW.updated = NOW()

Saya biasanya menggunakan AFTERpemicu hanya untuk memodifikasi tabel lain , BEFOREuntuk memodifikasi baris baru (atau diperbarui), atau menekan DELETE.


1

Jika seperti dalam kasus Anda, Anda ingin mengubah bidang yang diperbarui setiap kali catatan telah diubah, Anda tidak perlu pemicu.

Anda dapat menggunakan inisialisasi / pembaruan otomatis MySQL seperti ini:

ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

Atau pada saat pembuatan tabel, dari dokumen :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.