2012-02-13 2 views
14

Я пытаюсь использовать двойной первичный ключ в качестве внешнего ключа.Двойной внешний ключ в 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, 

    ... ??? 
); 

таблица AAA является объектом

стол ВВВ является многие к одному с ААА, и имеет псевдонимы AAA

Я пытаюсь создать сводную таблицу, CCC, который держит многие к одному между DDD и BBB.

Я предполагаю, что я хочу что-то вроде

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

где оба AAA_id и BBB_name внешние ключи, но они также всегда относится к тому же ряду в ГЭБ.

но, конечно, это недействительно. Каков наилучший способ создания такого поведения в postgreSQL?

+2

Это действительно действительно! Но это не называется *** «двойным» *** ключом, это ** «сложный» ** ключ. –

ответ

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

Так как {AAA_id, BBB_name} однозначно идентифицировать строку в ВВВ, внешний ключ {AAA_id, BBB_name} в CCC также будет ссылаться на одну уникальную строку в ВВВ.

Смежные вопросы