2016-09-21 3 views
0

이것은 만들려고하는 테이블입니다.테이블을 만들 수 없습니다. SQL 오류 02270

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

그러나, 나는 오류를

SQL Error: ORA-02270: no matching unique or primary key for this column-list

SQL을 얻는다.

+0

'time'은 (일부 버전의) SQL에서 예약어이기 때문에 가능할 수 있습니다. 이름을 바꿀 수도 있습니다. – dave

+0

시도해 보니 작동하지 않았습니다. 같은 오류가 발생합니다. –

+0

왜'courses' 테이블의 기본 키에'cname'을 포함해야합니까? 'cid'는 이미 유일한 식별자가 아닌가? (그렇지 않다면 왜 안 되겠습니까?) – mathguy

답변

2

Cause

오라-2270은 발생합니다.

  • 부모가 부모 테이블의 제약 조건은 복합 키이며, 우리는 외래 키 문에 모든 열을 참조하지 않은 모두
  • 제약이 없기 때문에이 될 수 있습니다.

COURSES 테이블에서 CIDprimary key이 아닙니다. cid,cname의 조합입니다. 따라서 모든 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, cname, rnotime :

가 구성되는 기본 키를보십시오.

다른 사람이 언급했듯이 courses의 기본 키는 (cid, cname)이므로 외래 키 제약 meets_fk1에도이 두 가지를 모두 포함시켜야합니다. 또는 가능한 경우 cidcourses의 기본 키인지 확인하십시오.

는 (그래서 아마 이름을 변경 고려 time는 예약어 될 수있다 생각합니다.) 오류 메시지에서 알 수 있듯이 no matching unique or primary key for this column-list있을 때

+0

'time'은 Oracle에서 예약어가 아닙니다 : http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm 일반적으로 항상 염두에 두어야 할 좋은 관심사입니다. – mathguy

관련 문제