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