Oracle外键关系

时间:2012-05-07 18:27:06

标签: oracle oracle10g oracle11g

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

4 个答案:

答案 0 :(得分:4)

一个表只能有一个主键 - 您有一个复合主键。如果您有复合主键,则必须引用子表中的整个键。这意味着子表需要有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的prielary键,您可能希望在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)); 

答案 1 :(得分:1)

假设密钥必须是CANDIDATE_ID和NAME的组合才是唯一的,那么您需要在引用表中添加对NAME列的引用。

我怀疑CANDIDATE_ID足以唯一地识别主表中的候选者。如果是这种情况,那么它应该是您的主键,您的关系将起作用。如果要单独索引NAME,请执行此操作,但将其从主键中删除。

答案 2 :(得分:0)

最后一行应该是这样的;

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

答案 3 :(得分:0)

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