【问题标题】:conditional insert statement in sqlite triggerssqlite触发器中的条件插入语句
【发布时间】:2011-01-05 20:30:15
【问题描述】:

sqlite 触发器是否支持条件 if/case/when 语句?

假设我有以下设置:

CREATE TABLE someTable (id INTEGER PRIMARY KEY, someValue INTEGER);
CREATE TRIGGER update_another_table AFTER  INSERT ON someTable 
BEGIN
    IF(new.someValue==0)
        DELETE FROM another_table WHERE (...some condition);
    ELSE
        IF NOT EXISTS(SELECT anotherValue  FROM another_table  WHERE anotherValue =new.someValue)
            INSERT INTO another_table  VALUES(new.someValue, ...);
        ELSE
            UPDATE another_table SET anotherValue = new.someValue;
END;

但是会出现语法错误Sqlite error near 'IF': syntax error"

【问题讨论】:

    标签: sqlite triggers insert if-statement


    【解决方案1】:

    这是一个语法错误,因为 SQLite 触发器的语法图不允许任何 IF 子句或 CASE WHEN 构造。

    但是你可以通过定义两个或三个使用WHEN条件的触发器来达到同样的效果,见http://sqlite.org/lang_createtrigger.html

    因此,您可以像这样为您的 DELETE 案例创建触发器:

    CREATE TRIGGER delete_from_other_table AFTER INSERT ON someTable
    WHEN new.someValue = 0
    BEGIN
       DELETE FROM anotherTable WHERE (... some condition );
    END;
    

    然后为 INSERT 和 UPDATE 情况添加另一个触发器,并具有适当的条件...

    CREATE TRIGGER update_another_table AFTER INSERT ON someTable
    WHEN new.someValue <> 0
    BEGIN
       ...
    END;
    

    【讨论】:

    • TL;DR:为每个条件创建触发器。 +1 了
    【解决方案2】:

    下面是一个带有子选择的触发器示例:

    表格

    创建表 A( ID 整数主键, 名称文本 ) 创建表日志( ID 整数主键, DT 文本 )


    使用子选择创建触发器

    插入后创建触发器 new_lns_historic 开 当 NEW.ID 不在时(从日志中选择 ID) 开始 插入日志值 (NEW.ID, DATETIME('NOW')); 结尾

    【讨论】:

    • 您好,欢迎来到 SO!你能试着回答这个问题吗?在这种情况下,语法错误Sqlite error near 'IF': syntax error"的原因是什么?
    • sqlite 中的条件必须在“开始”之前,如我的示例所示,并且据我所知,不要在 sqlite 中使用“IF”作为在 T-SQL 或 PLSQL 中使用的那样
    最近更新 更多