SQL错误:ORA-02256:引用列的数量必须与引用的列匹配。我不知道是怎么回事

时间:2013-12-02 04:22:41

标签: sql oracle key

这是我的代码:

create table PROGRAMS
(PROGNAME NVARCHAR2 (15) NOT NULL,
PRIMARY KEY (PROGNAME));

CREATE TABLE COMMITTEE_MEMBER
(CMNAME NVARCHAR2 (22) NOT NULL,
PROGNAME NVARCHAR2 (15) NOT NULL,
Q1 NVARCHAR2 (22),
Q2 NVARCHAR2 (21),
Q3 NVARCHAR2 (21),
Q4 NVARCHAR2 (21),
PRIMARY KEY (CMNAME, PROGNAME),
FOREIGN KEY (PROGNAME)
REFERENCES PROGRAMS
ON DELETE CASCADE);

CREATE TABLE DONATION_TYPE
(PROGNAME NVARCHAR2 (15) NOT NULL,
Q1 NVARCHAR2 (21),
Q2 NVARCHAR2 (21),
Q3 NVARCHAR2 (21),
Q4 NVARCHAR2 (21),
PRIMARY KEY (PROGNAME));

CREATE TABLE LOCATED_AT
(PROGNAME NVARCHAR2 (15) NOT NULL,
CAMPNAME NVARCHAR2 (15) NOT NULL,
PRIMARY KEY (PROGNAME, CAMPNAME),
FOREIGN KEY (PROGNAME)
REFERENCES PROGRAMS
ON DELETE CASCADE,
FOREIGN KEY (CAMPNAME)
REFERENCES CAMPUS 
ON DELETE CASCADE);

CREATE TABLE CAMPUS 
(CAMPNAME NVARCHAR2 (14) NOT NULL, 
 Q1 NVARCHAR2 (21),
 Q2 NVARCHAR2 (21),
 Q3 NVARCHAR2 (21),
 Q4 NVARCHAR2 (21),
 PRIMARY KEY (CAMPNAME));

CREATE TABLE DONOR 
(DONNAME NVARCHAR2 (22) NOT NULL,
PROGNAME NVARCHAR2 (15) NOT NULL,
PROJECT NVARCHAR2 (15), 
PRIMARY KEY (DONNAME, PROGNAME),
FOREIGN KEY (PROGNAME)
REFERENCES PROGRAMS
ON DELETE CASCADE);

CREATE TABLE CONTRIBUTION 
(CMNAME NVARCHAR2 (22) NOT NULL,
PROGNAME NVARCHAR2 (15) NOT NULL,
DONNAME NVARCHAR2 (22) NOT NULL,
AMOUNT NVARCHAR2 (8) NOT NULL,
DATE_ NVARCHAR2 (10) NOT NULL,
PRIMARY KEY (CMNAME, PROGNAME, DONNAME, AMOUNT, DATE_),
**FOREIGN KEY (CMNAME)** 
REFERENCES COMMITTEE_MEMBER 
ON DELETE CASCADE, 
FOREIGN KEY (PROGNAME)
REFERENCES PROGRAMS
ON DELETE CASCADE,
FOREIGN KEY (DONNAME)
REFERENCES DONOR
ON DELETE CASCADE);

粗体是它给我一个错误信息的地方。我不知道是怎么回事。请帮忙。

1 个答案:

答案 0 :(得分:3)

committee_member表在(CMNAME, PROGNAME)上有一个复合主键。同样,contribution中的外键也需要引用复合键,而不仅仅是作为主键一部分的两列中的一列。假设您希望PROGNAME中的CONTRIBUTION列成为外键的一部分,您可以执行类似

的操作
FOREIGN KEY( CMNAME, PROGNAME )
  REFERENCES committee_member(CMNAME, PROGNAME)
  ON DELETE CASCADE

就个人而言,我总是会在您引用的父表中指定列名,因为这只能提高清晰度。当您允许复合键时,它变得更加重要,因为它太容易无意中以不同于主键中列出的键的顺序列出子表中的列,这将导致非键的外键冲突错误很容易调试。