Подтвердить что ты не робот

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

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

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. Что я делаю неправильно?

4b9b3361

Ответ 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

Совет. Если команда "PRAGMA foreign_keys" не возвращает данные вместо одной строки, содержащей "0" или "1", то используемая вами версия SQLite не поддерживает внешние ключи (либо потому, что она старше 3.6.19 или потому, что он был скомпилирован с использованием SQLITE_OMIT_FOREIGN_KEY или SQLITE_OMIT_TRIGGER).

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