Reputation: 1601
I'm following the instructions from the SQLite documentation at http://www.sqlite.org/foreignkeys.html however my attempt to add a foreign key is failing. Here are my create statements:
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
);
The first table is made fine. The error occurs in the second statement. I have tried both with wrapping the two queries in a transaction and without. Here is the error:
unknown column "checklist_id" in foreign key definition (code 1): , while compiling: 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)
Upvotes: 49
Views: 44224
Reputation: 1720
You still have to create the column checklist_id INTEGER
before you add it as a Foreign key.
So it would be:
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)
);
Upvotes: 101
Reputation: 1715
I think the above answers are not entirely correct, or at least slightly misleading. As they correctly pointed out, you can create the column, then on a separate line add a foreign key constraint. This is called specifying a table constraint.
But there is also a shorter syntax, when applying only on 1 column, all 4 possible constraints (PRIMARY KEY
, UNIQUE
, CHECK
, FOREIGN KEY
) can also be specified inline (like NOT NULL
, for example), as a column constraint. I.e. you can write:
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
);
By the way, if you are ever unsure about the correct syntax, the official documentation has really nice railroad diagrams.
Upvotes: 2
Reputation: 33495
Simply you are missing checklist_id
column in your item table. You need to declare it before you want to set it as FOREIGN KEY
. You tried to create FK
on non-existing column and this is reason why it doesn't work.
So you need to add this:
checklist_id INTEGER,
FOREIGN KEY(checklist_id) REFERENCES checklist(_id)
now it should works.
Upvotes: 8
Reputation: 6281
You need to include the column name before you wrap it with 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
);
Upvotes: 5