Тригер для оновлення після оновлення?


13

Я хочу зробити тригер, щоб записати час будь-якого оновлення як:

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

Проблема полягає в тому, що коли цей тригер намагається оновити updatedстовпець, це також інша подія оновлення, яка запускає тригер. Це створить нескінченний цикл, який не працює.

Як я можу зберігати час оновлення у відповідному стовпці?

Я хочу використовувати тригер, оскільки в таблиці багато стовпців. Якщо я спробую встановити час оновлення вручну, мені потрібно буде змінити багато запитів.

Відповіді:


17

BEFOREЗамість цього використовуйте тригер і встановіть updatedстовпець, який присвоює значення NEW.updated(це було б простим призначенням, а не an UPDATE). Таким чином, ви не запустите додаткові UPDATEs.

Тіло вашого тригера буде просто виглядати

SET NEW.updated = NOW()

Зазвичай я використовую AFTERтригери лише для зміни інших таблиць, BEFOREдля зміни нового (або оновленого) рядка або придушення DELETE.


1

Якщо вам подобається у вашому випадку, ви хочете змінювати оновлене поле щоразу, коли запис змінюється, вам не потрібен тригер.

Ви можете використовувати автоматичну ініціалізацію / оновлення MySQL так:

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

Або під час створення таблиці з документів :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.