SQLite - Ограничения для внешних ключей - IOs 5 - PullRequest
8 голосов
/ 05 января 2012

Кажется, что ограничения внешних ключей поддерживаются начиная с версии 3.6.x в SQLite.Версия SQLite на IOS5.0 - 3.7.7 (находится в sqlite3.h).

Но когда я пытаюсь вставить строку в таблицу с ограничением, моя строка вставляется правильно, даже еслисвязанный внешний ключ не существует.У меня нет ошибки.

Выполнение одного и того же оператора вставки с помощью таких приложений, как Navicat, дает мне «ошибку нарушения ограничения»

Знаете ли вы, если внешние ключи поддерживаются в IO 5?1008 * Вот схема базы данных:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
)

CREATE TABLE "track" (
     "trackid" INTEGER PRIMARY KEY AUTOINCREMENT,
     "trackname" TEXT,
     "trackartist" INTEGER,
    CONSTRAINT "trackartist" FOREIGN KEY ("trackartist") REFERENCES "artist" ("artistid") ON DELETE CASCADE ON UPDATE CASCADE)

Действительно просто, не правда ли?

Спасибо, Эммануэль

Ответы [ 4 ]

13 голосов
/ 05 января 2012

Внешние ключи по умолчанию отключены. Вы должны включить их отдельно для каждого соединения. Настройка не «липкая». Это нужно делать каждый раз, когда вы подключаетесь к базе данных SQLite.

PRAGMA foreign_keys = ON;

Скорее всего, Navicat позаботится об этом за вас. В вашем собственном коде это ваша работа.

4 голосов
/ 06 января 2012

Я наконец-то нашел решение ... и могу сказать, что вы были правы.

По умолчанию база данных sqlite открывается с отключенной опцией внешних ключей, даже если таблицы построены с ограничениями внешних ключей!

Так что просто сделайте этот простой запрос:

PRAGMA foreign_keys=ON;

сразу после открытия базы данных и вне транзакции (если вы используете функцию fmdatabase и транзакции)

Надеюсь, это поможет кому-то еще.

Эммануил

2 голосов
/ 05 февраля 2013

Вот как я это делаю, используя FMDB:

[database executeUpdate:@"PRAGMA foreign_keys=ON"];
0 голосов
/ 06 января 2014

Это на док: SQLite Doc

и при открытии соединения:

[database executeUpdate:@"PRAGMA foreign_keys=ON"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...