SQLite отношения "многие ко многим"?

Я пытаюсь настроить базу данных SQLite3 с помощью foos и bars и отношение "многие ко многим" между ними. Вот что я получил до сих пор:

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 не в автоматическом режиме). Попытка сделать это не возвращает ошибку; это просто не имеет никакого эффекта.