3

我试图弄清楚如何将删除语句放在 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 mytableRAISE(FAIL, "mytrigger was activated")它编译得很好。

4

1 回答 1

5

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

坏消息是 SQLite 无法决定是否执行该DELETE语句。好消息是你并不关心DELETE语句是否被执行——你只关心行是否被删除。所以 - 始终执行该DELETE语句,但仅当您的条件返回 true 时才删除行:

CREATE TRIGGER mytrigger
    BEFORE INSERT ON mytable
BEGIN
    DELETE FROM mytable
    WHERE 1 == 1
END;
于 2013-09-11T11:57:39.113 回答