2012-07-18 34 views
35

http://www.sqlite.org/foreignkeys.htmlのSQLiteドキュメントの指示に従っていますが、外部キーを追加しようとしても失敗しています。ここに私の作成ステートメントがあります:SQLite外部キー

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

最初のテーブルはうまくいきます。 2番目のステートメントでエラーが発生します。私は2つのクエリを1つのトランザクションと2つのトランザクションでラップすることを試みました。

不明なカラム "checklist_id" in foreign key definition(コード1):コンパイル中に:CREATE TABLE item(_id INTEGER PRIMARY KEY AUTOINCREMENT、FOREIGN KEY(checklist_id))REFERENCESチェックリスト(_id)、item_text TEXT 、item_hint TEXT、item_order INTEGER、created_on INTEGER、modified_ON INTEGER)

答えて

69

外部キーとして追加する前に列を作成する必要があります。

だから、次のようになります。

CREATE TABLE 
    checklist (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_title TEXT, 
     description TEXT, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     item_text TEXT, 
     item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 
    ); 
+0

Doh!ありがとうございます! :-) –

+8

実際にはこれに1つの問題がありました...すべてのフィールドが定義された後に制約が来る必要があります。したがって、外部キー行はmodified_onの後になければなりません。 (もし2019年に助けを求めている人がいたら、こんにちは!) –

+0

私はこれを修正しました。 @ GeeksOnHugs、あなたはあなたの質問に答えを編集できるはずです。誰かが編集を承認する必要がありますが、将来誰かの回答に誤りがある場合は、2019年にその人のために編集することができます:) – Scen

4

あなたはFOREIGN KEY()でそれをラップする前に列名を含める必要があります。

CREATE TABLE 
    item (
     _id INTEGER PRIMARY KEY AUTOINCREMENT, 
     checklist_id INTEGER, 
     FOREIGN KEY(checklist_id) REFERENCES checklist(_id), 
     item_text TEXT, item_hint TEXT, 
     item_order INTEGER, 
     created_on INTEGER, 
     modified_on INTEGER 
    ); 
5

は、単にあなたの項目表にchecklist_id列が欠落しています。 FOREIGN KEYと設定する前に宣言する必要があります。存在しない列にFKを作成しようとしましたが、これが機能しない理由です。

だから、この追加する必要があります。今それが必要な作品

checklist_id INTEGER, 
FOREIGN KEY(checklist_id) REFERENCES checklist(_id) 

を。

3

SQLステートメントの最後にFOREIGN KEY定義を入れます