2012-02-13 10 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と1対多数である、と私は、ピボットテーブルを作成しようとしていますAAA

の別名を保持し、1の多くを保持しているCCCでありますDDDとBBBの間

私は私が

AAA_idとBBB_name両方が外部キーですが、彼らはまた、常に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 
); 

ような何かをしたいと思います。

もちろん、無効です。 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}は一意BBBの行を識別するので、CCCの外部キー{AAA_id、BBB_name}はまた、BBBの一方のユニークな行を参照します。