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)
列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)
);
itemテーブルにchecklist_id
列がないだけです。 FOREIGN KEY
として設定する前に宣言する必要があります。存在しない列にFK
を作成しようとしましたが、これが機能しない理由です。
これを追加する必要があります:
checklist_id INTEGER,
FOREIGN KEY(checklist_id) REFERENCES checklist(_id)
これで動作するはずです。
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
);
SQLステートメントの最後にFOREIGN KEY定義を配置します
上記の答えは完全に正しいわけではなく、少なくとも少し誤解を招くかもしれません。正しく指摘されているように、列を作成し、別の行に外部キー制約を追加できます。これは、テーブル制約の指定と呼ばれます。
しかし、より短い構文もあります1列のみに適用する場合、4つの可能な制約すべて(PRIMARY KEY
、UNIQUE
、CHECK
、FOREIGN 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
);
ところで、正しい構文がわからない場合は、 公式ドキュメント には本当に素晴らしい鉄道図があります。