2008-10-16 12 views
9

Me preguntaba, ¿hay alguna posibilidad de crear una tabla sin una clave principal, pero con dos claves externas, donde los pares de claves foráneas son siempre diferentes? Por ejemplo, una tabla STOCK con item_id y warehouse_id como claves externas de ITEMS y WAREHOUSES tablas. Por lo tanto, el mismo artículo puede estar en diferentes almacenes. La vista de la tabla:Dos claves foráneas en lugar de primaria

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 sin usar campo de clave principal con incremento automático o algo? La base de datos es Oracle.

Gracias!

Respuesta

3

sí que se llama un compuesto clave primaria

0

Si usted no está haciendo ningún tipo de consulta que lo necesita, no lo hace necesidad 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.

4

Puede crear una clave principal en dos columnas: haga clic en dos columnas en vista del diseñador> haga clic en el pk

O, usted podría 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.

+0

La clave primaria compuesta no impone ninguna restricción de clave externa ... –

0

No tiene tiene para crear un campo de clave principal "sin usar", 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.

0

Como todo el mundo ha dicho, puede crear una primaria 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 principales. Por lo tanto, no puede reemplazar una clave principal con 2 claves externas.

6

De esta manera:

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

No hay nada malo con una clave primaria compuesta por esto, pero es probablemente más fácil en la mayoría de las situaciones para crear una sola columna de clave principal 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 tener en cuenta 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.

Cuestiones relacionadas