Programing/데이터베이스(MySQL)

[Error Code] 1822. Failed to add the foreign key constraint

hye3193 2023. 10. 18. 16:26

foreign key의 제약 조건을 만족하지 않았을 때 발생하는 에러

 

외래키로 지정한 경우, 참조되는 키가 primary 키이거나 unique 제약조건을 가지고 있어야만 한다

 

나의 경우,

create table 상영관(
    극장번호 integer not null,
    상영관번호 integer check(상영관번호 between 1 and 10),
    영화제목 varchar(20),
    가격 integer check(가격 < 20000), 
    좌석수 integer,
    primary key (극장번호, 상영관번호),
    foreign key (극장번호) references 극장(극장번호)
);

create table 예약(
    극장번호 integer,
    상영관번호 integer,
    고객번호 integer,
    좌석번호 integer unique,
    날짜 date,
    primary key(극장번호, 상영관번호, 고객번호),
    foreign key(극장번호) references 극장(극장번호),
    foreign key(상영관번호) references 상영관(상영관번호)
    foreign key(고객번호) references 고객(고객번호)
);

예약 table에서 상영관 table을 참조하는 과정에서 해당 에러가 발생했고,

발생한 이유는 극장번호와 상영관번호가 묶인 복합키를 primary 처리했기 때문

 

상영관번호 단독으로는 unique도, primary key도 아니기 때문에 에러가 발생한 것이다...

그냥 상영관번호 속성 뒤에 unique를 붙여서 해결할 수도 있지만, 이 속성은 중복이 허용되어야 하기 때문에

create table 상영관(
    극장번호 integer not null,
    상영관번호 integer check(상영관번호 between 1 and 10),
    영화제목 varchar(20),
    가격 integer check(가격 < 20000), 
    좌석수 integer,
    primary key (극장번호, 상영관번호),
    foreign key (극장번호) references 극장(극장번호)
);

create table 예약(
    극장번호 integer,
    상영관번호 integer,
    고객번호 integer,
    좌석번호 integer unique,
    날짜 date,
    primary key(극장번호, 상영관번호, 고객번호),
    foreign key(극장번호, 상영관번호) references 상영관(극장번호, 상영관번호),
    foreign key(고객번호) references 고객(고객번호)
);

복합키를 참조하는 외래키로 변경해주었다

무사히 동작한다

 

다만 상영관 테이블의 기본키인 극장번호는 극장 테이블에서 참조해온 키인데, 외래키가 포함된 기본키를 다른 테이블에서 다시 참조해도 괜찮은 건지에 대해서는 잘 모르겠다...