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

sas*_*alm 3 sql sqlite triggers

我试图找出如何在SQLite触发器中的条件内放置一个删除语句.

我想出了这个示例代码:

CREATE TRIGGER mytrigger
    BEFORE INSERT ON mytable
BEGIN
    SELECT CASE WHEN 
        1 == 1
    THEN
        DELETE FROM mytable
    END;
END;
Run Code Online (Sandbox Code Playgroud)

但它无法编译:

Error: near "DELETE": syntax error
Run Code Online (Sandbox Code Playgroud)

如果我更换DELETE FROM mytableRAISE(FAIL, "mytrigger was activated"),它编译罚款.

Ida*_*rye 5

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

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

CREATE TRIGGER mytrigger
    BEFORE INSERT ON mytable
BEGIN
    DELETE FROM mytable
    WHERE 1 == 1
END;
Run Code Online (Sandbox Code Playgroud)