2011-08-04 11 views
16

私はfoobarのSQLite3データベースを設定しようとしており、それらの間に多対多の関係があります。これは私が今までに持っているものです:SQLiteの多対多の関係ですか?

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には影響しません。私は間違って何をしていますか?

答えて

13

このサイトから取られたhttp://www.sqlite.org/foreignkeys.html

外部キー制約を有効にしてライブラリをコンパイルすると、実行時にPRAGMA foreign_keysコマンドを使用してアプリケーションで有効にする必要があります。例:

外部キー制約はデフォルトで無効になっています(下位互換性のため)。したがって、データベース接続ごとに個別に有効にする必要があります。ただし、将来のリリースの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 

ヒント:コマンド「プラグマFOREIGN_KEYSは」「0」または「1」を含む単一の行の代わりにデータを返さない場合は、SQLiteのの、バージョンが、使用しています外部キーをサポートしていません(3.6.19より古いか、またはSQLITE_OMIT_FOREIGN_KEYまたはSQLITE_OMIT_TRIGGERを定義してコンパイルされたためです)。

(SQLiteが自動コミットモードではない)マルチステートメントトランザクションの途中で外部キー制約を有効または無効にすることはできません。これを行おうとしてもエラーは返されません。単に効果がありません。

+0

テーブルfoobarはおそらく(foo_id、bar_id)にプライマリキー制約を必要とします。しかしそれは別の問題です。 –

+0

@Catcall:私の投稿にコメントすることは自由です。 – wes

+0

aceの答えは、SQLiteのドキュメントから直接得られたもので、正確で完全なものです。しかし、私が言ったように、テーブルfoobarは 'PRIMARY KEY(foo_id、bar_id)'も必要とします。 –