2016-09-21 93 views
0

这是我正在创建的表。但是,我得到的错误无法创建表格。 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) 
); 

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

+0

可能是因为'时间'是SQL(某些版本)中的保留字。你可以尝试重命名它。 – dave

+0

试过了,它没有奏效。我犯了同样的错误。 –

+0

为什么你需要在'courses'的主键中包含'cname'? cid不是唯一的标识符吗? (如果不是,为什么不?) – mathguy

回答

2

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

那么如果我只需要'cid',我怎么会在表'Meet_in'中引用'cid,cname'呢?这可能吗? –

+0

为什么'cname'里面没有'not null'? –

+0

认为更好的解决方法是从PK中去除'cname' - 单独的'cid'就足够了。如果没有,这是一个应该纠正的独立问题。 – mathguy

1

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

尝试使用由以下组成的主键:cid,cnamernotime

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

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

+0

'时间'在Oracle中不是保留字:http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm通常,虽然始终牢记在心的是一个很好的关注点。 – mathguy