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 に答える