2012-01-05 7 views
8

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

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

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

вы знаете, если внешние ключи поддерживаются прошивкой 5?

Вот схемы базы данных:

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) 

Очень просто, не так ли?

Благодаря Эммануэль

+0

Можете ли вы опубликовать код, в который вы вставляете Таблица? – Eric

+0

Привет, я использую FMDatabase, код очень прост: [db executeUpdate: @ "вставить в дорожки (дорожки, дорожки) значения (?,?)", @ "новый трек", [Номер NSNumberWithInt: i ]] – ecaste

+0

Weird ... У меня есть тот же самый сценарий, что и вы ... (Navicat, iOS, FMDB). Тот же вопрос. Должен любить ТАК. – walkingbrad

ответ

13

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

PRAGMA foreign_keys = ON; 

Коэффициенты хорошие, что Navicat позаботится об этом для вас. В вашем собственном коде это ваша работа.

+0

Это здорово, но как мне это сделать? Я просто выполняю это в БД? Как использовать эту строку кода PRAGMA foreign_keys = ON? – Daniel

+0

@ Даниэль: Да, вы выполняете это, как если бы это был оператор SQL. [Подробнее о интерфейсе SQLite C] (http://www.sqlite.org/c3ref/prepare.html) –

+0

Спасибо, заработал и сейчас работает. ура – Daniel

4

Я, наконец, нашел решение .... и catcall, что вы были правы.

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

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

PRAGMA foreign_keys=ON; 

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

Надеется, что это поможет кто-то другое.

Эммануэль

2

Это, как я это сделать с помощью FMDB:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
0

Это на документ: SQLite Doc

и при открытии подключения:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
Смежные вопросы