Подтвердить что ты не робот

Составной ключ SQLite (2 внешних ключа) Таблица ссылок

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

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

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

У меня есть один стол, скажем, дома и еще один electric_items.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 3

Чтобы дополнить первый ответ, рекомендуется добавить имя к ограничениям, например, код ниже:

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));

Ответ 4

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

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
 );