2011-11-03 24 views
13

He leído el lugar fresco estilo BNF gramática SQLite para la instrucción create tableclave compuesta SQLite (2 llaves extranjeras) Enlace mesa

encontrar aquí: http://www.sqlite.org/lang_createtable.html

Me preguntaba cómo había crear una tabla de enlaces entre estos

Tengo una tabla, digamos, casas y otra electrical_items.

Quiero crear una tabla de enlaces para tener el house_id y el item_id como una clave compuesta, pero no estoy seguro de cómo voy a hacerlo, no parece permitir que una clave principal sea una clave externa?

N.B Quiero un tercer campo pap_tested que almacena la fecha en que el elemento eléctrico de la casa fue pap_test, por lo que esta tabla de enlace a través de la clave primaria compuesta parece ser la mejor opción.

Respuesta

27

Cualquiera de ellas debe trabajar para su tabla de asociación:

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

es probable que desee separate (single column) indexes on house_items.house_id and house_items.item_id también.

+0

Después de haber seguido el enlace no creo que se aplica como house_id es una clave principal de la casa y item_id de elementos. – Luke

1

No hay prohibición sobre una LLAVE PRINCIPAL que tampoco sea una LLAVE EXTRAÑA para aquellos diseños que requieren este tipo de relación. Sin embargo, su problema no es uno de ellos, ya que la PRIMARY KEY natural en la tabla de enlace es un compuesto de las dos columnas, cada una de FOREIGN KEY vuelve a una de las otras tablas.

+0

gracias, creo que debo haber leído mal la nueva gramática de estilo – Luke

0

Creo una tabla con dos claves externas y opciones de en cascada de actualización y en cascada de eliminación.

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

Sólo para complementar la primera respuesta, es una buena práctica añadir un nombre a las limitaciones, como el código de abajo:

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