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

标签 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"),它可以正常编译。

最佳答案

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

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

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

关于sql - SQLite 触发器中 "CASE WHEN ... THEN ... DELETE ... END"的正确语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740230/

相关文章:

sql - 检测到更新在 PostgreSQL SQL 函数(不是 PL/pgSQL)中失败

PHP、MySQL 查询已执行但表未更新

SQL Server 2012 列标识增量在第 7 个条目上从 6 跳到 1000+

java - 有没有办法简化这个三元语句?

sqlite - 如何在sqlite中插入触发器之前进行验证

MYSQL触发器问题-非常简单

SQL查询以查找交错的记录

Python使用pandas将numpy数组插入sqlite3数据库

python - 将查询提交到sqlite时,为什么IPython无法返回具有多个字段的记录?

大于条件的mysql触发器