2011-11-03 18 views
13

Ho letto l'piuttosto fresco stile grammatica BNF per lo SQLite create tableSQLite chiave composta (2 chiavi esterne) Collegamento tavolo

trovato qui: http://www.sqlite.org/lang_createtable.html

mi chiedevo come avrei andare sulla creazione di una tabella di collegamento tra questi

Ho una tabella, diciamo, case e un altro electric_items.

Voglio creare una tabella di collegamento per avere house_id e item_id come una chiave composta, ma non sono sicuro di come farei per farlo, non sembra consentire a una chiave primaria di essere una chiave straniera?

N.B Voglio un terzo campo pap_testato che memorizza la data in cui l'elemento elettrico in casa è stato pap_testato quindi questa tabella di collegamento tramite chiave primaria composita sembra l'approccio migliore.

risposta

27

Uno di questi dovrebbe funzionare per la vostra tabella di associazione:

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

probabilmente si vorrà separate (single column) indexes on house_items.house_id and house_items.item_id pure.

+0

aver seguito il link non credo si applica come house_id è una chiave primaria di casa e item_id di elementi. – Luke

1

Non esiste alcuna proibizione per una CHIAVE PRIMARIA, non essendo anche una CHIAVE STRANIERA per quei progetti che richiedono questo tipo di relazione. Il tuo problema non è uno di quelli, tuttavia, dal momento che la PRIMARY KEY naturale nella tabella di collegamento è un composto delle due colonne, ciascuna una FOREIGN KEY che riporta a una delle altre tabelle.

+0

grazie, penso di aver letto male la nuova grammatica con stile – Luke

0

Creo una tabella con due chiavi esterne e opzioni di aggiornamento in cascata e su eliminazione in cascata.

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

Proprio per completare la prima risposta, si tratta di una buona pratica di aggiungere un nome a vincoli, come il codice qui sotto:

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