2012-01-05 49 views
8

SQLiteのバージョン3.6.x以降、外部キー制約がサポートされているようです。 IOS5.0のSQLiteのバージョンは3.7.7です(sqlite3.hにあります)。SQLite - 外部キーの制約-Is 5

ただし、制約があるテーブルに行を挿入しようとすると、関連する外部キーが存在しない場合でも、行が正しく挿入されます。私は誤りがない。

は、Navicatのようなアプリケーションを使用して、同じinsert文は私に、「制約違反エラー」を与える

を行う外部キーがIOを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:@ "トラック(trackname、trackartist)の値(?、?)に挿入"、 @ "新しいトラック"、 [NSNumber numberWithInt:i ]] – ecaste

+0

奇妙な...私はあなたとまったく同じシナリオを持っています...(Navicat、iOS、FMDB)。同じ問題。愛していなければならない。 – walkingbrad

答えて

13

外部キーは、デフォルトでは無効になっています。接続ごとに個別に有効にする必要があります。設定は「粘着性」ではありません。 SQLiteデータベースに接続するたびにこれを行う必要があります。

PRAGMA foreign_keys = ON; 

Navicatがあなたのために処理するのは良いことです。あなた自身のコードでは、あなたの仕事です。

+0

それは素晴らしいですが、どうすればいいですか?私はDBにこれを実行するだけですか?この 'PRAGMA foreign_keys = ON'コード行はどうすれば使えますか? – Daniel

+0

@Daniel:はい、それをSQL文のように実行します。 [SQLiteのCインタフェースの詳細](http://www.sqlite.org/c3ref/prepare。html) –

+0

ありがとう、それを得て、今働いている。乾杯 – Daniel

4

私は最終的に解決策を見つけました....そして、あなたは正しいと思います。

デフォルトでは、テーブルが外部キー制約で構築されていても、外部キーオプションを無効にしてsqliteデータベースを開きます。

は、だから、この単純な要求を行います。

PRAGMA foreign_keys=ON; 

ただ、これは他の誰かを助ける

希望(あなたがfmdatabaseやトランザクション機能を使用している場合)、およびトランザクションの外部データベースを開いた後。

エマニュエル

2

これは私がFMDBを使用してそれを行う方法です。

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

それは、ドキュメント上にある: SQLite Doc

、あなたは接続を開く:

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