【问题标题】:SQLite Triggers: Only have a trigger take an action when a certain field is NOT included in the query?SQLite 触发器:仅当查询中不包含某个字段时,触发器才会执行操作?
【发布时间】:2014-04-14 22:39:04
【问题描述】:

通常,我有一个触发器来更新我的一个表中的 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”子句,但到目前为止我的咒语都没有成效。

这个可以吗?

【问题讨论】:

    标签: sqlite triggers conditional


    【解决方案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
        ...
    

    【讨论】:

    • 太棒了!这看起来是解决这个特定问题的方法。如果有任何问题,我会试一试并在这里发出声音。
    • 嗯...您的示例似乎总是在“FOR EACH ROW”行产生语法错误。似乎触发器语法不喜欢您的 IS NOT 比较。但是,在这里查看语法文档:sqlite.org/syntaxdiagrams.html#expr 看来您的语法应该是有效的。难住了。
    • FOR EACH ROW 必须在 WHEN 之前。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2021-09-07
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多