Как создать триггер на нескольких ключах на sqlite3 - PullRequest
0 голосов
/ 21 апреля 2009

Насколько я знаю, в SQLite 3 нет прямой возможности иметь ограничения внешнего ключа. У меня есть таблица «многие ко многим», которая нуждается в этом, поэтому я создаю триггер, который вызывает ABORT, когда внешний ключевое ограничение нарушено. Мое утверждение выглядит так:

CREATE TRIGGER fkFooBar
  BEFORE INSERT ON Foo_Bar
  FOR EACH ROW BEGIN
    SELECT RAISE (ABORT, 'Insert on Foo_Bar violates foreign key')
    WHERE ((SELECT id as fId FROM FOO WHERE fId = NEW.fooId) IS NULL) || ((SELECT id as bId FROM BAR WHERE bId = NEW.barId) IS NULL);
  END;

Но это ограничивает присутствие barId, а не fooId. Я только смутно знаком с SQL, и раньше не имел дело с триггерами, так что я немного растерялся в этом. Почему это не работает? Я поступаю об этом неправильно? Должно ли это быть намного проще? (то есть в одном операторе SELECT)

Ответы [ 2 ]

0 голосов
/ 28 апреля 2009

Поскольку на самом деле никто не ответил на вопрос , я спрашивал:

|| не является двоичным ИЛИ в sqlite. Просто используйте один |

0 голосов
/ 21 апреля 2009

Возьмите подсказку.

Триггеры, как правило, плохая идея. Вы обнаружили еще одну причину, по которой триггеры часто являются ошибкой.

Основная причина в том, что триггеры разбивают ваше программирование на две части. Код, который является кодом - и его легко найти и поддерживать - и код, который скрыт в базе данных и который гораздо сложнее найти и поддерживать.

Если это действительно трудно сделать, вы используете не тот инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...