无法创建表格。 SQL错误02270
这是我正在创建的表。但是,我得到的错误无法创建表格。 SQL错误02270
SQL Error: ORA-02270: no matching unique or primary key for this column-list
SQL:
create table Meets_In
(
cid char(20),
rno integer,
time char(20),
CONSTRAINT PRIM_KEY PRIMARY KEY(time),
constraint meets_fk1 foreign key(cid) references COURSES(CID),
constraint meets_fk2 foreign key(rno) references ROOMS(RNO)
);
这些都是父表:
create table Courses
(
cid char(20),
cname char(20),
credits integer,
constraint CoursesKey Primary Key (cid, cname)
);
CREATE TABLE ROOMS
(
rno INTEGER,
address CHAR(20),
capacity INTEGER,
CONSTRAINT room_key PRIMARY KEY(rno)
);
我不明白为什么我收到此错误。
Cause
的ORA-2270,作为错误信息显示,发生在有no matching unique or primary key for this column-list
。这可能是因为
- 父缺乏约束完全
- 父表的约束是一个复合键,我们还没有外键语句中引用的所有列。
现在在您的COURSES
表中,CID
不是primary key
。它是cid,cname
的组合。因此,对于每个cid
,可以有多行。
现在,如果您参考cid
作为meets_in
的外键,它将不起作用,因为它违反了第二点,如上所述。
Workaround
在meets_in
表添加列cname
为好。然后像下面一样使用它。
create table Meets_In
(
cid char(20) not null,
cname char(20),
rno integer not null,
time1 char(20) not null,
CONSTRAINT PRIM_KEY PRIMARY KEY(time1),
constraint meets_fk1 foreign key(cid,cname) references COURSES (cid,cname), /*Added cid,cname */
constraint meets_fk2 foreign key(rno) references ROOMS (RNO)
);
那么如果我只需要'cid',我怎么会在表'Meet_in'中引用'cid,cname'呢?这可能吗? –
为什么'cname'里面没有'not null'? –
认为更好的解决方法是从PK中去除'cname' - 单独的'cid'就足够了。如果没有,这是一个应该纠正的独立问题。 – mathguy
Meets_In
充当关联表。因此,它的主键应该将外键包括到它所关联的表中。
尝试使用由以下组成的主键:cid
,cname
,rno
和time
。
正如其他人所指出的,您的主键courses
是(cid, cname)
,所以您还需要在外键约束meets_fk1
中包含这两个。或者,如果可能,请确保cid
只是courses
上的主键。
(我认为time
可能是保留字,所以也许考虑重新命名它。)
'时间'在Oracle中不是保留字:http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm通常,虽然始终牢记在心的是一个很好的关注点。 – mathguy
可能是因为'时间'是SQL(某些版本)中的保留字。你可以尝试重命名它。 – dave
试过了,它没有奏效。我犯了同样的错误。 –
为什么你需要在'courses'的主键中包含'cname'? cid不是唯一的标识符吗? (如果不是,为什么不?) – mathguy