Я следую инструкциям из документации SQLite на http://www.sqlite.org/foreignkeys.html, однако моя попытка добавить внешний ключ не работает. Вот мои заявления о создании:
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
);
Первая таблица сделана отлично. Ошибка возникает во втором выражении. Я пробовал оба с упаковкой двух запросов в транзакции и без нее. Вот ошибка:
неизвестный столбец "checklist_id" в определении внешнего ключа (код 1): при компиляции: CREATE TABLE item (_id INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY (checklist_id) Контрольный список ССЫЛКИ (_id), item_text TEXT, item_hint TEXT, item_order INTEGER, created_In 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)
);
Просто вы не видите столбец checklist_id
в таблице item. Вы должны объявить его, прежде чем хотите установить его как 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
);
Поместите определение FOREIGN KEY в конец оператора SQL
Я думаю, что приведенные выше ответы не совсем верны или, по крайней мере, немного вводят в заблуждение. Как они правильно указали, вы можете создать столбец, а затем в отдельной строке добавить ограничение внешнего ключа. Это называется заданием ограничения таблицы.
Но есть и более короткий синтаксис: при применении только к 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
);
Кстати, если вы никогда не уверены в правильном синтаксисе, официальная документация имеет действительно хорошие железнодорожные диаграммы.