Несуществующий внешний ключ не вызывает ошибку в SQLite - PullRequest
1 голос
/ 30 мая 2019

Следующий код должен вызвать ошибку IMO, поскольку user_id=1 не существует. Почему это работает?

CREATE TABLE users (
user_id int PRIMARY KEY,
email text UNIQUE
);

CREATE TABLE claimed (
account_id int PRIMARY KEY,
user_id int,
domain text,
FOREIGN KEY (user_id) REFERENCES users (user_id)
);

INSERT INTO claimed
(user_id, domain)
VALUES (1, "abcd");

1 Ответ

0 голосов
/ 30 мая 2019

С соответствующая документация :

Чтобы использовать ограничения внешнего ключа в SQLite, библиотека должна быть скомпилирована без определения SQLITE_OMIT_FOREIGN_KEY или SQLITE_OMIT_TRIGGER.Если SQLITE_OMIT_TRIGGER определено, а SQLITE_OMIT_FOREIGN_KEY нет, то SQLite ведет себя так же, как и до версии 3.6.19 (2009-10-14) - определения внешнего ключа анализируются и могут запрашиваться с использованием PRAGMA foreign_key_list, но внешний ключограничения не применяются.

и:

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

и:

Если библиотека скомпилирована с включенными ограничениями внешнего ключа, она все равно должна быть включена приложением во время выполнения с помощью команды PRAGMA foreign_keys.Например:

sqlite> PRAGMA foreign_keys = ON;

Очевидно, вы должны использовать PRAGMA foreign_keys = ON в верхней части вашего соединения и потенциально перестроить с соответствующими параметрами (хотя, если вы установили из пакета, тоЯ бы лично предположил, что это было сделано).

Источник: Google sqlite foreign key, первый результат

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