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

4 回答 4

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并且您可能希望在 上创建单独的唯一约束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)); 
于 2012-05-07T18:40:21.233 回答
1

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

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

于 2012-05-07T18:39:27.663 回答
0

最后一行应该是这样的;

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

于 2012-05-07T18:37:51.360 回答
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)
 );
于 2017-07-19T05:21:38.583 回答