Как создать триггер для нескольких ключей на sqlite3

Насколько мне известно, в 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;

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


person Ed Marty    schedule 21.04.2009    source источник


Ответы (2)


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

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

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

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

person S.Lott    schedule 21.04.2009
comment
Код. Обычный старый код. На каком языке написано ваше приложение? Используйте этот язык. Если у вас есть уровень объектно-реляционного сопоставления (ORM), ваш код триггера помещается туда, а не в базу данных. - person S.Lott; 21.04.2009

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

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

person Ed Marty    schedule 28.04.2009