47

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)

4

5 に答える 5

94

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)
    );
于 2012-07-18T15:46:23.193 に答える
6

単にアイテムテーブルchecklist_idに列がありません。として設定する前に、宣言する必要があります。存在しない列で作成しようとしましたが、これが機能しない理由です。FOREIGN KEYFK

したがって、これを追加する必要があります。

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

今では動作するはずです。

于 2012-07-18T15:55:12.293 に答える
5

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
    );
于 2012-07-18T15:49:03.537 に答える
3

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

于 2014-08-05T13:14:26.947 に答える
1

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

ただし、より短い構文もあります。1つの列にのみ適用する場合、4つの可能な制約(、、、、)すべてPRIMARY KEYを列制約としてインラインで指定することもできます(たとえば、などUNIQUECHECK。つまり、あなたは書くことができます:FOREIGN KEYNOT 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
);

ちなみに、正しい構文がわからない場合は、公式ドキュメントに非常に優れた鉄道図があります。

于 2018-11-06T13:43:42.280 に答える