Внешний ключ SQLite

39

Я следую инструкциям из документации 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)

Теги:
create-table
foreign-key-relationship

5 ответов

69
Лучший ответ

Вам еще нужно создать столбец 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)
    );
4

Просто вы не видите столбец checklist_id в таблице item. Вы должны объявить его, прежде чем хотите установить его как FOREIGN KEY. Вы пытались создать FK в несуществующем столбце, и это причина, по которой он не работает.

Итак, вам нужно добавить это:

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

теперь он должен работать.

3

Вам нужно указать имя столбца, прежде чем переносить его с помощью 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
    );
2

Поместите определение FOREIGN KEY в конец оператора SQL

0

Я думаю, что приведенные выше ответы не совсем верны или, по крайней мере, немного вводят в заблуждение. Как они правильно указали, вы можете создать столбец, а затем в отдельной строке добавить ограничение внешнего ключа. Это называется заданием ограничения таблицы.

Но есть и более короткий синтаксис: при применении только к 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
);

Кстати, если вы никогда не уверены в правильном синтаксисе, официальная документация имеет действительно хорошие железнодорожные диаграммы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню