SQLite отношение многих ко многим? - PullRequest
17 голосов
/ 04 августа 2011

Я пытаюсь настроить базу данных SQLite3 с foo s и bar s и отношением "многие ко многим" между ними. Это то, что у меня так далеко:

CREATE TABLE foo(
    id INTEGER PRIMARY KEY NOT NULL,
    foo_col INTEGER NOT NULL
);
CREATE TABLE bar(
    id INTEGER PRIMARY KEY NOT NULL,
    bar_col TEXT NOT NULL
);
CREATE TABLE foobar(
    foo_id INTEGER,
    bar_id INTEGER,
    FOREIGN KEY(foo_id) REFERENCES foo(id) ON DELETE CASCADE,
    FOREIGN KEY(bar_id) REFERENCES bar(id) ON DELETE CASCADE
);
CREATE INDEX fooindex ON foobar(foo_id);
CREATE INDEX tagindex ON foobar(tag_id);

... но, похоже, это не работает. Я могу удалить строку из foo, и это не повлияет на foobar. Что я делаю не так?

1 Ответ

14 голосов
/ 04 августа 2011

взято с этого сайта, http://www.sqlite.org/foreignkeys.html.

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

sqlite> PRAGMA foreign_keys = ON;

Ограничения внешнего ключа по умолчанию отключены (для обратной совместимости), поэтому должны быть включены отдельно для каждого соединения с базой данных отдельно. (Тем не менее, обратите внимание, что будущие выпуски SQLite могут измениться, так что ограничения внешнего ключа будут включены по умолчанию. Внимательные разработчики не будут делать никаких предположений относительно того, включены ли внешние ключи по умолчанию, но вместо этого будут включать или отключать их при необходимости.) Приложение может также использовать оператор PRAGMA foreign_keys, чтобы определить, включены ли в настоящее время внешние ключи. Следующий сеанс командной строки демонстрирует это:

sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_keys = OFF;
sqlite> PRAGMA foreign_keys;
0

Подсказка: если команда «PRAGMA foreign_keys» не возвращает данных вместо одной строки, содержащей «0» или «1», то используемая версия SQLite не поддерживает внешние ключи (либо потому, что она старше 3,6 .19 или потому, что он был скомпилирован с определением SQLITE_OMIT_FOREIGN_KEY или SQLITE_OMIT_TRIGGER).

Невозможно включить или отключить ограничения внешнего ключа в середине транзакции с несколькими утверждениями (когда SQLite не находится в режиме автоматической фиксации). Попытка сделать это не возвращает ошибку; это просто не имеет никакого эффекта.

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