개발 etc

mysql 외래키 적용하려 할 때 mysql foreign key Support transactions, row-level locking, and foreign key 에러 날 때

알통몬_ 2017. 5. 3. 10:53
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


저는 mysql 5.5.54 버전을 사용하고 있는데요.

foreign key를 적용하려고 했더니


위와 같은 에러가 뜨더라구요 ;;;


먼저 제가 사용한 sql 쿼리문입니다.


parent table :

create table parent (

email varchar(40) not null primary key,

name varchar(8) not null

) ENGINE=INNODB; 


child table :

create table child (

email varchar(40) not null,

rank int not null,

FOREIGN KEY(email) REFERENCES parent(email) ON UPDATE CASCADE ON DELETE CASCADE

) ENGINE=INNODB;  


위처럼 만들려고 했지만,

parent 테이블은 정상적으로 생성이 되었는데,

child 테이블은 계속해서

첫 번째 사진같은 에러를 뱉더라구요.

그래서 매뉴얼에 있는대로 인덱스도 넣어보고,

구글링해서 여러방법을 찾아보았는데, 해결을 못하다가

오늘 아침에 해결방법을 찾아서 이렇게 포스팅을 합니다.


해결 방법은 부모 테이블의 character set과 자식 테이블의 character set을

통일시켜주는 것입니다.

parent table :

create table parent (

email varchar(40) not null primary key,

name varchar(8) not null

) ENGINE=INNODB character set = utf8; 


child table :

 create table child (

email varchar(40) not null,

rank int not null,

FOREIGN KEY(email) REFERENCES parent(email) ON UPDATE CASCADE ON DELETE CASCADE

) ENGINE=INNODB character set=utf8;  


이렇게 sql 문을 작성하면 외래키가 적용된 테이블이 정상적으로 생성되는 것을 확인할 수 있습니다.


그리고 에러가 나는 여러 경우가 있는데요,

1. Data type이 다른 경우

parent.email 의 데이터 타입이 varchar 인데

child.email 의 데이터 타입이 char 타입이라던지 하면 에러가 발생합니다.

그리고 숫자 형의 경우도 signed 인지 unsigned 인지도 일치시켜줘야 합니다.


2. ON DELETE NULL 을 지정했는데 child.email을 not null 로 지정하는 경우입니다.

create table child (

email varchar(40) not null,

rank int not null,

FOREIGN KEY(email) REFERENCES parent(email) ON DELETE NULL

) ENGINE=INNODB character set=utf8;   


뭐 더 여러가지 상황이 있겠지만

저는 이만 ㅎㅎ

이상입니다.

반응형