2012-02-13 11 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, 

    ... ??? 
); 

तालिका एएए एक वस्तु

तालिका बीबीबी एएए के साथ एक के लिए कई है, और एएए

का उपनाम धारण

मैं पिवट तालिका, सीसीसी, जो एक के लिए एक बहुत रखती है बनाने के लिए कोशिश कर रहा हूँ डीडीडी और बीबीबी के बीच।

मुझे लगता है कि मैं

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} सीसीसी में भी एक अद्वितीय पंक्ति बीबीबी में दर्शाएंगे।