我希望每当更新行时使用当前时间戳更新字段.
在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)