2012-01-05 151 views
8

似乎SQLite中版本3.6.x以來支持外鍵約束。 IOS5.0上的SQLite版本是3.7.7(在sqlite3.h中找到)。SQLite - 外鍵約束 - IO 5

但是,當我嘗試在具有約束的表中插入一行時,即使相關的外鍵不存在,也可以正確插入我的行。我沒有錯誤。

否則使用應用程序,如Navicat的給了我一個「約束違規錯誤」

你知道,如果外鍵的支持iOS 5同樣的INSERT語句?

下面是數據庫模式:

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 2012-01-05 16:21:42

+0

嗨,我使用FMDatabase,代碼非常簡單:[db executeUpdate:@「insert into track(trackname,trackartist)values(?,?)」, @「new track」, [NSNumber numberWithInt:i ]] – ecaste 2012-01-05 16:24:51

+0

奇怪...我有和你一樣的場景......(Navicat,iOS,FMDB)。同樣的問題。得到愛是如此。 – walkingbrad 2013-05-18 21:56:12

回答

13

外鍵默認情況下禁用。您必須爲每個連接分別啓用它們。該設置不是「粘性」。每次連接到SQLite數據庫時都必須執行此操作。

PRAGMA foreign_keys = ON; 

Navicat爲您妥善處理這個問題的可能性很大。在你自己的代碼中,這是你的工作。

+0

這很棒,但我該怎麼做?我只是執行這個數據庫?我如何使用這個'PRAGMA foreign_keys = ON'代碼行? – Daniel 2012-07-03 19:37:07

+0

@Daniel:是的,你執行它就好像它是一個SQL語句。 [有關SQLite的C接口的詳細信息](http://www.sqlite.org/c3ref/prepare。html) – 2012-07-03 20:09:38

+0

謝謝,現在就開始工作吧。乾杯 – Daniel 2012-07-03 20:16:21

4

我終於找到了解決方案....並噓你是對的。

默認情況下,即使已使用外鍵約束構建表,禁用了外鍵打開的sqlite數據庫!

所以才使這個簡單的要求:

PRAGMA foreign_keys=ON; 

剛剛開放的數據庫,以及外部的事務(如果您正在使用fmdatabase和交易功能)

希望這將幫助別人之後。

靈光

2

這是它使用FMDB我該怎麼辦:

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

這是對DOC: SQLite Doc

,當你打開連接:

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