无法创建表。 SQL错误02270

时间:2016-09-21 02:52:12

标签: sql database oracle oracle11g oracle-sqldeveloper

这是我要创建的表。但是,我收到了错误

  

SQL错误:ORA-02270:此列列表没有匹配的唯一键或主键

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

我不明白为什么会收到此错误。

2 个答案:

答案 0 :(得分:2)

  

原因

正如no matching unique or primary key for this column-list所示,ORA-2270会出现错误消息。这可能是因为

  • 父母完全没有约束
  • 父表的约束是复合键,我们没有引用外键语句中的所有列。

现在,在COURSES表中,CID不是primary key。它是cid,cname的组合。因此,对于每个cid,可以有多行。

现在当您将cid作为meets_in的外键引用时,它将无效,因为它违反了我上面提到的第二点。

  

解决方法

cname表格中添加列meets_in。然后像下面一样使用它。

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

答案 1 :(得分:1)

Meets_In充当关联表。因此,它的主键应该将外键包含在它所关联的表中。

尝试使用以下主键:cidcnamernotime

正如其他人所说,courses的主键是(cid, cname),因此您还需要在外键约束meets_fk1中包含这两个键。或者,如果可能,请确保cid仅是courses上的主键。

(我认为time可能是一个保留字,所以也许可以考虑重命名它。)