在UPDATE之后触发UPDATE吗?


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列时,它也是另一个运行触发器的更新事件。这将创建一个无限循环,该循环将不起作用。

如何将更新时间存储在相应的列中?

我希望使用触发器,因为表中有很多列。如果尝试手动设置更新时间,则需要修改许多查询。

Answers:


17

请改用BEFORE触发器,然后将updated分配值的列设置为NEW.updated(这将是一个简单的分配,而不是UPDATE)。这样,您将不会触发其他UPDATE

您的触发器主体将看起来像

SET NEW.updated = NOW()

我通常AFTER只将触发器用于修改其他表,BEFORE修改新(或更新)行或抑制DELETE


1

如果像您的情况一样,您想在每次更改记录时都更改更新的字段,则不需要触发器。

您可以像这样使用MySQL的自动初始化/更新:

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

或者在创建表时,通过docs

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.