Составной ключ SQLite (2 внешних ключа) Таблица ссылок - PullRequest
15 голосов
/ 04 ноября 2011

Я прочитал довольно классную грамматику BNF для оператора создания таблицы SQLite

найдено здесь: http://www.sqlite.org/lang_createtable.html

Мне было интересно, как бы я создал таблицу ссылок между этими

У меня есть один стол, скажем, дома, и другой electric_items.

Я хочу создать таблицу ссылок, в которой house_id и item_id будут составным ключом, но я не уверен, как мне это сделать, похоже, что первичный ключ не может быть внешний ключ?

NB. Мне нужно третье поле pap_tested, в котором хранится дата, когда электрический элемент в доме был pap_tested, поэтому эта таблица связывания через составной первичный ключ кажется наилучшим подходом.

Ответы [ 4 ]

31 голосов
/ 04 ноября 2011

Любой из этих вариантов должен работать для вашей таблицы сопоставления:

create table house_items (
    house_id integer not null,
    item_id  integer not null,
    foreign key (house_id) references houses(id),
    foreign key (item_id) references electrical_items(id),
    primary key (house_id, item_id)
)

create table house_items (
    house_id integer not null references houses(id),
    item_id  integer not null references electrical_items(id),
    primary key (house_id, item_id)
)

Возможно, вы захотите отдельных (один столбец) индексов для house_items.house_id и house_items.item_id.

2 голосов
/ 04 августа 2016

Просто для дополнения первого ответа, хорошей практикой является добавление имени к ограничениям, как показано ниже:

create table house_items (
    house_id integer not null,
    item_id  integer not null,
    constraint house_items_pk primary key (house_id, item_id),
    constraint house_items_house_fk foreign key (house_id) references houses(id),
    constraint house_items_items_fk foreign key (item_id) references electrical_items(id));
1 голос
/ 04 ноября 2011

Нет запрета на ПЕРВИЧНЫЙ КЛЮЧ, который также не является ИНОСТРАННЫМ КЛЮЧОМ для тех конструкций, которые требуют такого рода отношения Однако проблема не в этом, поскольку естественный PRIMARY KEY в таблице ссылок представляет собой смесь двух столбцов, каждый из которых FOREIGN KEY возвращается к одной из других таблиц.

0 голосов
/ 22 января 2014

Я создаю таблицу с двумя внешними ключами и опциями каскада обновлений и каскада удаления.

CREATE TABLE category_subcategory
(
 category_subcategory_id INTEGER PRIMARY KEY,
 category_id             INTEGER NOT NULL,
 subcategory_id          INTEGER NOT NULL,
 FOREIGN KEY(category_id) REFERENCES categories(id) ON DELETE CASCADE ON
 UPDATE CASCADE,
 FOREIGN KEY(subcategory_id) REFERENCES subcategories(subcategory_id) ON
 DELETE CASCADE ON UPDATE CASCADE
 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...