SQLite отношения "многие ко многим"?
Я пытаюсь настроить базу данных 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 ответов
взято с этого сайта, 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
Tip: если команда "PRAGMA foreign_keys" не возвращает данных вместо одной строки, содержащей "0" или "1", версия SQLite, которую вы используете, не поддерживает внешние ключи (либо потому, что она старше 3.6.19, либо потому, что она была скомпилирована с sqlite_omit_foreign_key или sqlite_omit_trigger).
это не возможно, чтобы включить или отключить ограничения внешнего ключа в середине мульти-транзакции (когда SQLite не в автоматическом режиме). Попытка сделать это не возвращает ошибку; это просто не имеет никакого эффекта.