2012-02-13 94 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是一個對象

表BBB是多對一與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外鍵的,但他們也總是指的是在BBB同一行。

但當然這是無效的。在PostgreSQL中產生這種行爲的最好方法是什麼?

+2

這是完全有效的!但它不被稱爲***「double」***鍵,它是一個**「複合」**鍵。 – 2012-02-13 20:54:22

回答

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}唯一標識BBB一排,外鍵{AAA_id,BBB_name}在CCC也將在BBB引用一個唯一的行。