Подтвердить что ты не робот

Условная вставка в SQL-триггерах

Является условным, если утверждения /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"

4b9b3361

Ответ 1

Это синтаксическая ошибка, так как синтаксическая диаграмма для SQLite Triggers не допускает никаких предложений 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;

И чем добавить еще один триггер для случая INSERT и UPDATE с соответствующими условиями...

CREATE TRIGGER update_another_table AFTER INSERT ON someTable
WHEN new.someValue <> 0
BEGIN
   ...
END;