sqlite - SQLite触发器:仅当查询中未包含某个字段时,触发器才会执行操作吗?

标签 sqlite triggers conditional

通常,我有一个触发器来更新我的一个表中的date_last_modified字段。我遇到的问题有时是我需要在date_last_modified字段中手动调整时间戳。但是,当我这样做时,触发器将触发并将其设置回now()。

这是我的触发器:

CREATE TRIGGER Preference_on_update After UPDATE ON Preference for each row 
begin 
    update Preference set date_last_modified = datetime('now') 
    where rowid = old.rowid; 
end


我只想在更新未包含date_last_modified字段的值时才触发此触发器。如果更新语句包括date_last_modified,则触发器不应进行任何调整。

我仔细阅读了SQLite触发器的文档和语法,并发现有一个“ WHEN”子句,但是到目前为止,我对它的所有阐述都​​没有取得丰硕的成果。

能做到吗?

最佳答案

触发器可以限制为一组特定的列:

CREATE TRIGGER Preference_on_update
AFTER UPDATE OF ID, Name, Value, Description ON Preference
FOR EACH ROW
BEGIN
    ...


但是,与其他任何列一起更改日期时,这无济于事。

更好的主意是检查日期值是否实际更改,即旧值和新值是否不同。
(当涉及NULL值时,<>始终为false,因此最好在此处使用IS NOT NULL。)

CREATE TRIGGER Preference_on_update
AFTER UPDATE ON Preference
FOR EACH ROW
WHEN OLD.date_last_modified IS NOT NEW.date_last_modified
BEGIN
    ...

关于sqlite - SQLite触发器:仅当查询中未包含某个字段时,触发器才会执行操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23071645/

相关文章:

format - 图表中的条件颜色更改

C# 条件等效于 !DEBUG

javascript - 如果条件为假则防止违约

sqlite:选择显示匹配行周围的几行

java - 在 Android SQLite 数据库 onCreate() 中重新抛出异常

c# - 将日志对象保存到 sqlite no id 仅插入一条记录?

触发器中的 Mysql 案例不起作用

android - SQlite表升级困难

jenkins - 当远程 Jenkins 作业完成时触发 Jenkins 构建

mysql - 触发截断不正确的 DOUBLE 值