首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >触发器更新后更新?

触发器更新后更新?
EN

Database Administration用户
提问于 2012-07-03 16:48:44
回答 3查看 44.8K关注 0票数 14

我想做一个触发器来记录任何更新的时间如下:

代码语言:javascript
运行
复制
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列时,它也是另一个update事件,它运行触发器。这将创建一个无限循环,但不起作用。

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

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

EN

回答 3

Database Administration用户

回答已采纳

发布于 2012-07-03 17:00:24

使用BEFORE触发器,并设置为NEW.updated分配值的updated列(这将是一个简单的赋值,而不是UPDATE)。这样你就不会触发额外的UPDATEs了。

你的触发体看起来就像

代码语言:javascript
运行
复制
SET NEW.updated = NOW()

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

票数 19
EN

Database Administration用户

发布于 2017-11-06 10:29:24

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

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

代码语言:javascript
运行
复制
ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

或者在创建表时,从医生那里

代码语言:javascript
运行
复制
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
票数 1
EN

Database Administration用户

发布于 2021-08-19 19:46:53

使用,时(pg_trigger_depth() < 1)

代码语言:javascript
运行
复制
CREATE TRIGGER trigger_name
after insert or update
ON [TABLE] FOR EACH ROW
WHEN (pg_trigger_depth() < 1)
EXECUTE PROCEDURE public.proc_name();
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/20328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档