【问题标题】:reference the composite primary key引用复合主键
【发布时间】:2012-08-30 17:41:04
【问题描述】:

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

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

【问题讨论】:

  • 为什么不把SID定义为主键呢?如果CARD_F 和CARD_S 是学生的唯一标识,是否将它们作为唯一键?

标签: oracle oracle10g oracle11g


【解决方案1】:

外键定义为另一个表中的键。您不能引用不是键的元组。

见下面 W3schools 的外键页面:

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

(link)

【讨论】:

  • 外键应该指向另一个表的PRIMARY 或UNIQUE 键。
  • 我从来没想过。我想你是对的。 W3schools 已过时:)
  • 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));
【解决方案2】:

bookno 从名为 card_f 的列中获取值似乎很奇怪。

这个不正确的引用有几种不同的方式

, FOREIGN KEY (BOOKNO) 
    REFERENCES STUDENT(CARD_F)

可以修复。

  1. 在 student.card_f 上创建主键约束。
  2. 在 student.card_f 上创建唯一约束。
  3. 引用另一个表,该表在 bookno 列上具有主键约束或唯一约束,可能类似于 books.bookno。
  4. 在 student 表中的 {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) 引用完整密钥。

其中,3、4 和 5 最有可能适用于您的情况。

【讨论】:

    【解决方案3】:

    选项:

    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
    

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 1970-01-01
      • 2021-02-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多