【问题标题】:Oracle foreign key relationOracle 外键关系
【发布时间】:2017-07-19 13:35:40
【问题描述】:

我的Candidate 表中有一个复合主键

CREATE TABLE CANDIDATE(
CANDIDATE_ID VARCHAR(5),
NAME VARCHAR(30),
TELEPHONE NUMBER,
PRIMARY KEY(CANDIDATE_ID, NAME));

当我创建子表时,我收到一条错误消息,指出当我为 CANDIDATE_ID 创建外键时,引用列的数量必须与引用的列匹配

CREATE TABLE JOB(
POSITION_ID VARCHAR(5) PRIMARY KEY,
CANDIDATE_ID VARCHAR(5),
DATE2 DATE,
FOREIGN KEY(CANDIDATE_ID) REFERENCES CANDIDATE); 

【问题讨论】:

  • 为什么选择制作复合主键? CANDIDATE_ID 还不足以作为唯一键吗?
  • 我之所以选择它,是因为这样做会更有效率,而且对于这项特定的工作会更好

标签: oracle oracle10g oracle11g


【解决方案1】:

一张表只能有一个主键——你有一个复合主键。如果您有复合主键,则必须引用子表中的整个键。这意味着子表需要有一个CANDIDATE_ID 列和一个NAME 列。

CREATE TABLE job (
  position_id VARCHAR2(5) PRIMARY KEY,
  candidate_id VARCHAR2(5),
  name         VARCHAR2(30),
  date2        DATE,
  FOREIGN KEY( candidate_id, name ) REFERENCES candidate( candidate_id, name )
);

当然,您可能不想在两个表中都存储name。您可能希望 candidate_id 成为 candidate 的主键,并且您可能希望在 name 上创建单独的唯一约束。

CREATE TABLE CANDIDATE(
  CANDIDATE_ID VARCHAR(5) primary key,
  NAME VARCHAR(30) unique,
  TELEPHONE NUMBER);

CREATE TABLE JOB(
  POSITION_ID VARCHAR(5) PRIMARY KEY,
  CANDIDATE_ID VARCHAR(5),
  DATE2 DATE,
  FOREIGN KEY(CANDIDATE_ID) REFERENCES CANDIDATE(candidate_id)); 

【讨论】:

  • 那么唯一键和主键有什么区别,因为它们的含义基本相同
  • @john - 一个表可以有 1 个且只有 1 个主键。主键应该是不可变的(即它不应该被更新)。这就是应该在外键中使用的内容。基于业务规则,一个表可以有许多不同的唯一约束,但是这些规则可能会随着时间而改变,并且列中的数据可能会随着时间而改变(即 Sarah SMith 可能会变成 Sarah Jones)。子表在定义外键关系时不应使用简单的唯一约束,因为该数据可能会发生变化。
【解决方案2】:

假设键的唯一性需要 CANDIDATE_ID 和 NAME 的组合,那么您需要在引用表中添加对 NAME 列的引用。

我怀疑 CANDIDATE_ID 足以唯一标识主表中的候选人。如果是这种情况,那么它应该是您的主键,并且您的关系将起作用。如果您想单独索引 NAME,请执行此操作,但不要将其放在主键之外。

【讨论】:

    【解决方案3】:

    最后一行应该是这样的;

    CONSTRAINT FK_CANDIDATE_ID FOREIGN KEY (CANDIDATE_ID)REFERENCES CANDIDATE(CANDIDATE_ID);

    【讨论】:

    • 当我输入代码时,它显示此列列表没有匹配的唯一键或主键
    【解决方案4】:
    CREATE TABLE dept
    ( did char(3) not null,
      dname varchar2(20) not null,
      CONSTRAINT dept_pk PRIMARY KEY (did)
    );
    

    强文本

     create table emp
     (
      eid char(3) unique,
      ename varchar2(10) not null,
      sal number check (sal between 20000 AND 50000),
      city varchar2(10) default 'texus',
      did char(3) not null,
      constraint fk_did_dept
      FOREIGN KEY (did) references
      dept(did)
     );
    

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多