Условие в триггере SQLite для наследования - PullRequest
0 голосов
/ 13 июня 2018

Я работаю с SQLite, я использую XOR-наследование одной таблицы, я хочу создать триггер, который позволит мне:

  1. Проверить перед вставкой, если InstructionRefs.id ужесозданный в таблице RideHeightRefs
  2. Проверьте перед вставкой, что InstructionRefs.id не существует в другой унаследованной таблице StrappingRefs.enter image description here Я взял какой-то оракул PL / SQL-код и изменил его. Наверное, я пишу его неправильно, начиная с IF NOT EXISTS (SELECT id...):

    CREATE TRIGGER IF NOT EXISTS insert_instructionRefs_trigger BEFORE INSERT ON InstructionRefs<br> BEGIN<br> IF NOT EXISTS (SELECT id FROM RideHeightRefs AS RHR INNER JOIN InstructionRefs IR ON RHR.id = IR.id)<br> BEGIN<br> SELECT RAISE(FAIL, '"RideHeightRefs" key is unknown. Insertion in "instructionRefs" is impossible.')<br> END'<br> IF NOT EXISTS (SELECT * FROM (SELECT RideHeightRefs FROM StrappingRefs UNION ALL SELECT RideHeightRefs FROM InstructionRefs) T WHERE RideHeightRefs IN (SELECT RideHeightRefs FROM NEW)) BEGIN SELECT RAISE(FAIL, '"RideHeightRefs" key is used in another table. Insertion in "StrappingRefs" is impossible.') END END

Как изменить код, чтобы сделать его совместимым с синтаксисом sqlite?

1 Ответ

0 голосов
/ 14 июня 2018

Чтобы проверить, что соответствующая строка в базовой таблице существует, просто используйте ограничение внешнего ключа .

SQLite не имеет оператора IF.Чтобы что-то проверить, добавьте предложение WHERE в SELECT FAIL или используйте предложение WHEN триггера:

CREATE TRIGGER IF NOT EXISTS insert_instructionRefs_trigger
BEFORE INSERT ON InstructionRefs
WHEN EXISTS (SELECT *
             FROM StrappingRefs
             WHERE id = NEW.id)
BEGIN
  SELECT RAISE(FAIL, '"RideHeightRefs" key is used in another table. Insertion in "StrappingRefs" is impossible.');
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...