在使用SQLite更新current_timestamp

Jon*_*nas 25 sqlite triggers

我希望每当更新行时使用当前时间戳更新字段.

在MySQL中,我会在声明表时这样做

LastUpdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

但是"on update"部分不适用于SQLite.我找不到自动执行的方法,是否需要声明触发器?

编辑:为了记录,这是我当前的触发器:

CREATE TRIGGER [UpdateLastTime]
AFTER UPDATE
ON Package
FOR EACH ROW
BEGIN
UPDATE Package SET LastUpdate = CURRENT_TIMESTAMP WHERE ActionId = old.ActionId;
END
Run Code Online (Sandbox Code Playgroud)

谢谢

Wis*_*guy 22

是的,你需要使用触发器.(只是检查:你发布的触发器是否正常工作?乍一看,它看起来很好.)

MySQL ON UPDATE CURRENT_TIMESTAMP是一个非常独特的,单一用途的快捷方式.就是这样; 对于任何其他值或除以外的任何列类型,此构造不能类似地使用TIMESTAMP.(注意如何在TIMESTAMP类型页面而不是CREATE TABLE页面上定义此功能,因为此功能特定于TIMESTAMP列而不是特定于CREATE TABLE语句.)还值得一提的是,虽然它特定于某个TIMESTAMP类型,但SQLite甚至没有明确的日期/时间类型.

据我所知,没有其他RDBMS提供此快捷方式代替使用实际触发器.根据我的阅读,必须使用触发器在MS SQL,SQLite,PostgreSQL和Oracle上完成此操作.


对路人的最后一点注意事项:

这不应与与ON UPDATE外键约束有关的子句混淆.这是完全不同的东西,可能所有支持外键约束的RDBMS都包含(包括MySQL和SQLite).


aMa*_*ruz 11

John 对默认的 SQLite 设置是正确的,这个触发器会导致无限循环。为避免递归,请使用 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;
Run Code Online (Sandbox Code Playgroud)

  • 应该将“WHEN NEW.LastUpdate &lt; OLD.LastUpdate”改为“WHEN NEW.LastUpdate = OLD.LastUpdate”吗?因为我们希望触发器在值未更改时运行。 (2认同)