not - sqlite default value
Tecla compuesta SQLite(2 claves externas) Tabla de enlaces (4)
He leído la gramática BNF con un estilo bastante genial para SQLite create table statement
encontrado aquí: http://www.sqlite.org/lang_createtable.html
Me preguntaba cómo haría para crear una tabla de enlaces entre estos
Tengo una mesa, digamos, casas y otros artículos eléctricos.
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.
NB Quiero un tercer campo de prueba que almacena la fecha en que el elemento eléctrico de la casa fue analizado, por lo que esta tabla de enlace a través de la clave primaria compuesta parece ser el mejor enfoque.
Cualquiera de estos debería funcionar 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)
)
Probablemente también desee índices separados (columna única) en house_items.house_id
y house_items.item_id
.
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.
Creo una tabla con dos claves foráneas y opciones de on update cascade y en delete cascade.
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
);
Solo para complementar la primera respuesta, es una buena práctica agregar un nombre a las restricciones, como el siguiente código:
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));