2012-08-30 138 views
0

朋友的我創建了一個具有三列的複合主鍵的表,然後我創建了子表,其中只有兩個列,這將導致錯誤。請幫助我參考只有兩列基表。引用複合主鍵

CREATE TABLE STUDENT 
(SID NUMBER 
, NAME VARCHAR2(20) 
, DEPT VARCHAR2(20) 
, CARD_F NUMBER 
, CARD_S NUMBER 
, PRIMARY KEY (SID, CARD_F, CARD_S) 
); 

CREATE TABLE MASTER 
(BOOKNO NUMBER 
, CARD_S NUMBER 
, FOREIGN KEY (BOOKNO) 
    REFERENCES STUDENT(CARD_F) 
); 
+0

你爲什麼不定義'SID'作爲主鍵?如果'CARD_F'和'CARD_S'唯一標識一個學生,把它們作爲唯一的密鑰? –

回答

1

外鍵是通過定義另一個表中的鍵。你不能反駁一個不重要的元組。

見外鍵頁面下在W3School:

在一個表指向一個外鍵到另一個表的主鍵。

link

+0

外鍵應指向另一個表的「PRIMARY」或「UNIQUE」鍵。 –

+0

我從來沒有想過。我想你是對的。 W3schools is obsolete :) –

+0

CREATE TABLE STUDENT(SID NUMBER,NAME VARCHAR2(20),DEPT VARCHAR2(20), CARD_F NUMBER,CARD_S NUMBER,PRIMARY KEY(SID,CARD_F,CARD_S)); CREATE TABLE MASTER(BOOKNO NUMBER,CARD_S NUMBER, FOREIGN KEY(BOOKNO)REFERENCES STUDENT(CARD_F)); – sdrsurendhar

1

這似乎很奇怪的bookno從指定的列card_f取其值。

有幾種不同的方式這種不正確的參考

, FOREIGN KEY (BOOKNO) 
    REFERENCES STUDENT(CARD_F) 

可以是固定的。

  1. 在student.card_f上創建主鍵約束。
  2. 在student.card_f上創建一個唯一約束。
  3. 引用一個不同的表,它在bookno列上具有主鍵約束或唯一約束,可能類似於books.bookno。
  4. 在學生表中的一對列{card_s,card_f}上創建主鍵或唯一約束,並使用foreign key (card_s, card_f) references student (card_s, card_f)引用該主鍵或唯一約束。
  5. 將SID列添加到主數據庫,並使用foreign key (sid, card_s, bookno) references student (sid, card_s, card_f)引用完整密鑰。

其中,3,4,和5是最有可能在你的情況下工作。

0

選項:

1> Please check if you can create a unique Key on the two columns on the base table the you want to refer to. 

2> a)If you cant create unique key then intoduce a 3rd table which would maintain 
    distinct combination of column values for columns, to be included in F.K. 
    through a trigger on base table. 

    b)Make columns in your child table refer(F.K) to this newly introduced table