2012-02-13 17 views
14

Intento utilizar una clave principal doble como clave externa.Tecla Extranjera doble en postgresql

Create table AAA (
    AAA_id int primary key 
); 

create table BBB (
    AAA_id int, 
    BBB_name character varying(20), 
    primary key (AAA_id, BBB_name) 
); 

create table CCC (
    AAA_id, 
    BBB_name, 
    DDD_id, 

    ... ??? 
); 

mesa de AAA es un objeto

mesa de acreditación es de muchos a uno con AAA, y tiene los alias de AAA

Estoy tratando de crear una tabla dinámica, CCC, que tiene un muchos a uno entre DDD y BBB.

Supongo que quiero algo así como

create table CCC (
    AAA_id, 
    BBB_name, 
    DDD_id, 
    foreign key (AAA_id, BBB_name) references BBB(AAA_id, BBB_name) on update cascade 
); 

donde tanto AAA_id y BBB_name son claves externas, pero también siempre estamos refiriendo a la misma fila en la acreditación.

pero, por supuesto, eso no es válido. ¿Cuál es la mejor manera de producir este tipo de comportamiento en postgreSQL?

+2

¡Es perfectamente válido! Pero no se llama una *** llave *** "***", es una tecla ** "compuesta" **. –

Respuesta

16
Create temp table AAA (
    AAA_id int primary key 
); 

create temp table BBB (
    AAA_id int not null references AAA (AAA_id), 
    BBB_name character varying(20) not null, 
    primary key (AAA_id, BBB_name) 
); 

create temp table CCC (
    AAA_id int not null, 
    BBB_name character varying(20) not null, 
    DDD_id integer not null, 
    -- Guessing at the primary key. 
    primary key (AAA_id, BBB_name, DDD_id), 
    foreign key (AAA_id, BBB_name) references BBB (AAA_id, BBB_name) 
     on update cascade 
); 

Desde {AAA_id, BBB_name} identificar de forma única una fila en la acreditación, la clave foránea {AAA_id, BBB_name} en CCC también hará referencia a una fila única en la acreditación.