SQLite触发器中“CASE WHEN ... THEN ... DELETE ... END”的正确语法?

时间:2013-09-11 11:43:31

标签: sql sqlite triggers

我正在试图弄清楚如何在SQLite触发器中将条件放在条件中。

我想出了这个示例代码:

CREATE TRIGGER mytrigger
    BEFORE INSERT ON mytable
BEGIN
    SELECT CASE WHEN 
        1 == 1
    THEN
        DELETE FROM mytable
    END;
END;

但它无法编译:

Error: near "DELETE": syntax error

如果我将DELETE FROM mytable替换为RAISE(FAIL, "mytrigger was activated"),则编译正常。

1 个答案:

答案 0 :(得分:5)

AFAIK SQLite不支持条件执行。 CASE表达式是条件评估(不执行!)的表达式(不是语句!)。这意味着您可以使用它来选择要返回的值 - 但不能选择要执行的语句。

坏消息是SQLite无法决定是否执行DELETE语句。好消息是你并不关心DELETE语句是否被执行 - 你只关心是否删除了行。所以 - 总是执行DELETE语句,但只有在条件返回true时才删除行:

CREATE TRIGGER mytrigger
    BEFORE INSERT ON mytable
BEGIN
    DELETE FROM mytable
    WHERE 1 == 1
END;