2012-05-07 80 views
0

我在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); 
+1

你为什么选择做一个复合主键? CANDIDATE_ID不够唯一的密钥? – rayd09

+0

我选择了它,因为这将是更有效的这样做的和这个特定的工作 – john

回答

0

最后一行应该是这样的;

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

+0

更多更好,当我键入的代码,它说,这列清单 – john

1

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

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

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的prmiary键,你可能要在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)); 
+0

没有匹配的唯一或主键那么究竟是什么独特的,主要的区别键,因为它们的含义基本相同 – john

+0

@john - 一个表可以有1个且只有1个主键。主键应该是不可变的(即不应该更新)。而这正是应外键使用。一个表可以根据业务规则很多不同的独特的约束,但是这些规则可能会随时间而改变,并在列中的数据可能会随时间而改变(即萨拉·史密斯可能成为莎拉·琼斯)。在定义外键关系时,子表不应该使用简单的唯一约束,因为这些数据可能会发生变化。 –

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