Триггер для ОБНОВЛЕНИЯ после ОБНОВЛЕНИЯ?

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столбец, это также другое событие обновления, которое запускает триггер. Это создаст бесконечный цикл, который не работает.

Как я могу сохранить время обновления в соответствующем столбце?

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

Googlebot
источник

Ответы:

17

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

Ваше тело триггера будет просто выглядеть

SET NEW.updated = NOW()

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

Dezso
источник
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
);
Тобиас Бивинг
источник