引用复合主键

时间:2012-08-30 08:51:59

标签: oracle oracle10g oracle11g

朋友我创建了一个包含三列复合主键的表,然后我创建了一个只引用两列的子表。这会产生错误..请帮助我仅从基表中引用两列。

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)
); 

3 个答案:

答案 0 :(得分:1)

外键是defition,是另一个表中的键。你不能提供一个非密钥的元组。

见W3schools的外键页面:

  

一个表中的FOREIGN KEY指向另一个表中的PRIMARY KEY。

link

答案 1 :(得分: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列添加到master,并使用foreign key (sid, card_s, bookno) references student (sid, card_s, card_f)引用完整密钥。
  6. 其中,3,4和5最适合您的情况。

答案 2 :(得分: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