触发器在更新后再次触发更新?

我想创建一个触发器来记录任何更新的时间,如下所示:
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列时,它也是另一个更新事件,会运行触发器。这将创建一个无限循环,无法正常工作。 我该如何将更新时间存储在相应的列中? 我希望使用触发器,因为表中有许多列。如果我尝试手动设置更新时间,我需要修改很多查询语句。
3个回答

使用一个`BEFORE`触发器,并将值分配给`NEW.updated`列来设置`updated`列(这只是一个简单的赋值,而不是一个`UPDATE`)。这样你就不会触发额外的`UPDATE`了。 你的触发器代码将会简单地如下所示:
SET NEW.updated = NOW()
我通常只使用AFTER触发器来修改其他表,使用BEFORE来修改新的(或更新的)行,或者禁止DELETE操作。

如果像在你的情况下,你希望每当记录被更改时都更改更新字段,你不需要触发器。

你可以像这样使用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
);

使用 WHEN (pg_trigger_depth() < 1)

CREATE TRIGGER trigger_name
after insert or update
ON [TABLE] FOR EACH ROW
WHEN (pg_trigger_depth() < 1)
EXECUTE PROCEDURE public.proc_name();

pg_trigger_depth 在 MySql 中不存在。它是特定于 PostreSQL 的。 - rob