2016-09-21 96 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