每当行被更新时,我想用当前时间戳更新一个字段。
在MySQL中,当声明表时,我会这样做
LastUpdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP但是“”部分不适用于SQLite。我找不到自动的方法,我需要声明一个触发器吗?
编辑:为了记录,下面是我当前的触发器:
CREATE TRIGGER [UpdateLastTime]
AFTER UPDATE
ON Package
FOR EACH ROW
BEGIN
UPDATE Package SET LastUpdate = CURRENT_TIMESTAMP WHERE ActionId = old.ActionId;
END谢谢
发布于 2011-07-05 16:02:10
是的,你需要用扳机。(只是检查一下:你发布的触发器是否正常工作?)乍一看,我觉得很好。)
MySQL的ON UPDATE CURRENT_TIMESTAMP是一个非常独特的、单一用途的快捷方式.它就是这样的;这个构造不能以类似的方式用于任何其他值或除TIMESTAMP之外的任何列类型。(注意这个功能是如何在TIMESTAMP type page而不是CREATE TABLE page上定义的,因为这个功能是特定于TIMESTAMP列的,而不是一般的CREATE TABLE语句。)还值得一提的是,虽然它是特定于TIMESTAMP类型的,但是SQLite doesn't even have distinct date/time types。
据我所知,没有其他RDBMS提供这个快捷方式来代替使用实际的触发器。据我所读,必须使用触发器在MS、SQLite、PostgreSQL和Oracle上完成这一任务。
给过路人的最后一张便条:
这不应与涉及外键约束的ON UPDATE子句混淆。这是完全不同的,可能所有支持外键约束的RDBMS都有(包括MySQL和SQLite)。
发布于 2015-03-17 09:11:30
对于默认的SQLite设置,John是正确的,此触发器将导致无限循环。若要避免递归,请使用WHEN子句。
即使recursive_triggers设置是打开的,也可以执行以下操作:
PRAGMA recursive_triggers=1; --- test
CREATE TRIGGER [UpdateLastTime]
AFTER UPDATE
ON package
FOR EACH ROW
WHEN NEW.LastUpdate < OLD.LastUpdate --- this avoid infinite loop
BEGIN
UPDATE Package SET LastUpdate=CURRENT_TIMESTAMP WHERE ActionId=OLD.ActionId;
END;发布于 2018-05-19 21:58:46
有更有效、更好和更干净的方法来做到这一点,例如:
-- List all required fields after 'OF' except the LastUpdate field to prevent infinite loop
CREATE TRIGGER UpdateLastTime UPDATE OF field1, field2, fieldN ON Package
BEGIN
UPDATE Package SET LastUpdate=CURRENT_TIMESTAMP WHERE ActionId=ActionId;
END;这样的代码已经在我的项目中测试过了。在这里可以找到https://www.sqlite.org/lang_createtrigger.html的深层sqlite触发器解释
https://stackoverflow.com/questions/6578439
复制相似问题