оператор условной вставки в триггерах sqlite - PullRequest
13 голосов
/ 05 января 2011

Условные операторы if / case / when поддерживаются в триггерах SQLite?

Допустим, у меня есть следующие настройки:

CREATE TABLE someTable (id INTEGER PRIMARY KEY, someValue INTEGER);
CREATE TRIGGER update_another_table AFTER  INSERT ON someTable 
BEGIN
    IF(new.someValue==0)
        DELETE FROM another_table WHERE (...some condition);
    ELSE
        IF NOT EXISTS(SELECT anotherValue  FROM another_table  WHERE anotherValue =new.someValue)
            INSERT INTO another_table  VALUES(new.someValue, ...);
        ELSE
            UPDATE another_table SET anotherValue = new.someValue;
END;

Но возникает синтаксическая ошибка Sqlite error near 'IF': syntax error"

1 Ответ

36 голосов
/ 06 января 2011

Это синтаксическая ошибка, поскольку синтаксическая диаграмма для триггеров SQLite не допускает ни предложений IF, ни конструкций CASE WHEN.

Но вы можете добиться того же эффекта, определив два или три триггера, которые используют условие WHEN, см. http://sqlite.org/lang_createtrigger.html

Таким образом, вы должны создать триггер для своего случая DELETE следующим образом:

CREATE TRIGGER delete_from_other_table AFTER INSERT ON someTable
WHEN new.someValue = 0
BEGIN
   DELETE FROM anotherTable WHERE (... some condition );
END;

А затем добавить еще один триггер для случая ВСТАВИТЬ и ОБНОВИТЬ с соответствующими условиями ...

CREATE TRIGGER update_another_table AFTER INSERT ON someTable
WHEN new.someValue <> 0
BEGIN
   ...
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...