2012-08-30 151 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