SQLite触发器:只有在查询中不包含某个字段时才有触发器执行操作?

时间:2014-04-14 22:39:05

标签: sqlite triggers conditional

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

这是我的触发器:

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"但是,到目前为止,我的咒语都没有取得丰硕的成果。

可以这样做吗?

1 个答案:

答案 0 :(得分:1)

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

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
    ...