database - restricción - relacionar tablas en sql server por codigo
Dos claves externas en lugar de primaria (8)
Como todos han dicho, puede crear un primario a partir de 2 columnas. No tiene que crear una columna artificial de incremento automático.
Además, tenga en cuenta que las claves externas tienen un propósito diferente al de las claves primarias. Por lo tanto, no puede reemplazar una clave principal con 2 claves externas.
Me preguntaba, ¿hay alguna posibilidad de crear una tabla sin una clave principal, pero con dos claves externas, donde los pares de claves externas siempre son diferentes? Por ejemplo, una tabla STOCK
con item_id
y warehouse_id
como claves foráneas de las tablas ITEMS
y WAREHOUSES
. Por lo tanto, el mismo artículo puede estar en diferentes almacenes. La vista de la mesa:
item_id warehouse_id quantity
10 200 1000
10 201 3000
10 202 10000
11 200 7000
11 202 2000
12 203 5000
¿O tengo que crear un campo de clave principal sin usar con incremento automático o algo así? La base de datos es Oracle.
¡Gracias!
Desea una clave primaria compuesta .
Me gusta esto:
create table stock
( item_id references items(item_id)
, warehouse_id references warehouses(warehouse_id)
, quantity number(12,2) not null
, constraint stock_pk primary key (item_id, warehouse_id)
);
No tiene que crear un campo de clave primaria "no utilizada", pero a menudo hace la vida más simple. (Como señala Paul T, deberá especificar ambos campos para eliminar una fila).
A menudo denomino tales columnas "PK", para hacer obvia su utilidad limitada.
No hay nada de malo con una clave primaria compuesta para esto, pero probablemente sea más fácil en la mayoría de las situaciones crear una sola columna de clave primaria de todos modos. A menos que tenga restricciones de hardware particulares, la columna pk probablemente solo mejore el rendimiento y sea fácil de mantener.
No olvide considerar que puede haber situaciones que pueden no adaptarse perfectamente a su modelo. Por ejemplo, puede tener stock que sabe que existe, pero que actualmente no sabe en qué almacén se encuentra, o en tránsito, o aún no asignado, o lo que sea. O bien necesita crear reglas de negocio para ajustar esto en su clave primaria compuesta o usar una columna de clave principal en su lugar.
Si no está haciendo ningún tipo de consulta que lo necesita, no necesita una clave principal. Sin embargo, es un poco más difícil eliminar un registro sin ambigüedades. Es posible que desee establecer una restricción única en item_id, warehouse_id si Oracle lo permite.
sí, se llama clave primaria compuesta
Puede crear una clave principal en dos columnas: haga clic en ambas columnas en la vista del diseñador> haga clic en pk
O bien, puede agregar una restricción única en 2 columnas:
ALTER TABLE [dbo].[RepresentativeData]
add CONSTRAINT [UK_Representative_repRecID_AppID] unique (repRecID,AppId)
go
Prefiero la clave primaria compuesta porque obliga a que el valor exista en las otras tablas.