web-dev-qa-db-ja.com

SQLite外部キー

http://www.sqlite.org/foreignkeys.html にあるSQLiteのドキュメントの手順に従っていますが、外部キーを追加しようとしても失敗します。 create文は次のとおりです。

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)の不明な列 "checklist_id":、コンパイル中: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)

40
Geeks On Hugs

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

だから:

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)
    );
75
Scen

itemテーブルにchecklist_id列がないだけです。 FOREIGN KEYとして設定する前に宣言する必要があります。存在しない列にFKを作成しようとしましたが、これが機能しない理由です。

これを追加する必要があります:

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

これで動作するはずです。

4
Simon Dorociak

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
    );
3
reika

SQLステートメントの最後にFOREIGN KEY定義を配置します

2
rudakovsky

上記の答えは完全に正しいわけではなく、少なくとも少し誤解を招くかもしれません。正しく指摘されているように、列を作成し、別の行に外部キー制約を追加できます。これは、テーブル制約の指定と呼ばれます。

しかし、より短い構文もあります1列のみに適用する場合、4つの可能な制約すべて(PRIMARY KEYUNIQUECHECKFOREIGN KEY)インラインで指定することもできます(NOT NULL、たとえば)、列制約として。つまりあなたは書ける:

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

ところで、正しい構文がわからない場合は、 公式ドキュメント には本当に素晴らしい鉄道図があります。

0
szmate1618