2017-09-29 12 views
0

キー親削除するとき、子供のキーが削除されません。私は次のように見えるのSQLiteを介してデータベースを作っ

enter image description here

と私はこのようなbooksと呼ばれるテーブルを作成する:

CREATE TABLE books (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "title-book" TEXT, witer TEXT, comment TEXT, "intro-img" TEXT, "avalable-count" integer, "total-count" integer, "publisher-id" INTEGER REFERENCES publisher (id) ON DELETE CASCADE ON UPDATE CASCADE, "category-id" INTEGER REFERENCES categories (id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY ("publisher-id") REFERENCES publisher (id) ON DELETE CASCADE ON UPDATE CASCADE); 

私はその後、私はカテゴリが削除しなかったことなどが子キー列を有する本テーブルを参照してください、彼らは彼らがいたとしてfollowiのように存在して図書category-idの親キーがあるカテゴリを削除する場合NG写真:

enter image description here enter image description here

+0

チェック。また、 "PRAGMA foreign_keys"コマンドは、サポートされていれば "no data"ではなく0または1を返さなければなりません。さらに詳しい情報:https://sqlite.org/foreignkeys.html – LordNeo

+0

私はこのコードを試しました:PRAGMA foreign_keys;それは0を返し、私もこのコードを使用します:PRAGMA foreign_keys = ON;確かに有効です –

+0

は、サポートされているがデフォルトでは無効になっているので、有効にしてもう一度テストしてください。また、接続ごとに有効にする必要があります。 '外部キー制約はデフォルトで無効になっています(下位互換性のために)、データベース接続ごとに個別に有効にする必要があります。 ' – LordNeo

答えて

1

のSQLite 3.6.19および外部キーをサポートしていない古いです。 新しいバージョンをお持ちの場合は、使用してサポートを確認することができます。

PRAGMA foreign_keys 

それが返された場合は、「データなし」を返すながら、それは、(それがSQLITE_OMIT_FOREIGN_KEYまたはSQLITE_OMIT_TRIGGER定義してコンパイルされたので)インストールサポートがないこと0は「サポートされているが無効」を意味します。(デフォルト)とは、1が「サポートされ有効」であることを意味します。

あなたは

PRAGMA foreign_keys = ON; 

これは、すべてのデータベース接続を有効にする必要がありますので注意してください使用して、実行時に有効にすることができます。

外部キー制約が(後方互換性のために)デフォルトでは無効になっている、そうでなければなりませんがデータベース接続ごとに個別に有効にします。

も考慮してください。

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

REFERENCE:あなたのsqliteのバージョンが3.6.9より新しい、それは外部キーが有効になっていることをhttps://sqlite.org/foreignkeys.html

+0

その作業です! PRAGMA foreign_keys = ON; PRAGMA foreign_keysが無効になっていました。 私の質問がこの1つに変更されました 毎回PRAGMA foreign_keys = ONにする必要がある場合は、私はこのプロジェクトを顧客に送信すると仮定します。このコードは、どのように顧客からこれを行うように頼むことができますか? 他のシステムでデータベースを正しく動作させたい どうすればいいですか? –

+0

初期データベース接続を設定する設定ファイルがある場合は、そこに追加することができます。そのため、db接続が開始されるたびに呼び出されます – LordNeo

関連する問題