web-dev-qa-db-fra.com

Clé composite SQLite (2 clés étrangères) Table des liens

J'ai lu la grammaire assez stylée BNF pour l'instruction SQLite create table

trouvé ici: http://www.sqlite.org/lang_createtable.html

Je me demandais comment j'allais créer un tableau de liens entre ces

J'ai une table, disons, des maisons et une autre électricité.

Je souhaite créer une table de liens pour que les identifiants house_id et item_id constituent une clé composite, mais je ne sais pas comment procéder. Cela ne semble pas autoriser une clé primaire à être une clé étrangère?

NB Je veux un troisième champ pap_tested qui stocke la date à laquelle l’élément électrique de la maison a été pap_tested; cette table de liaison via une clé primaire composite semble donc la meilleure approche.

14
Luke

L'un ou l'autre devrait fonctionner pour votre table d'association:

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

Vous voudrez probablement aussi des index séparés (une seule colonne) sur house_items.house_id et house_items.item_id .

29
mu is too short

Il n'y a pas d'interdiction qu'une clé primaire ne soit pas aussi une clé étrangère pour les modèles qui nécessitent ce type de relation. Votre problème n'en est cependant pas un, car la clé primaire naturelle de la table de liaison est un composite des deux colonnes, chacune correspondant à une clé étrangère dans l'une des autres tables.

1
Larry Lustig

Pour compléter la première réponse, il est recommandé d’ajouter un nom aux contraintes, comme le code ci-dessous:

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
Danilo Teodoro

Je crée une table avec deux clés étrangères et des options de cascade de mise à jour et de cascade de suppression.

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
 );
0
Suleman Ilyas