공부공간

MariaDB error 1005 : Foreign key constraint is incorrectly formed 해결법 본문

Spring/JPA

MariaDB error 1005 : Foreign key constraint is incorrectly formed 해결법

개발자가될수있을까? 2020. 8. 16. 00:55

JPA 관련 내용은 아니지만 1시간 30분여동안의 뻘짓을 기록하기 위해 + 어차피 DB랑 관련이 있으니까

 

 

프로젝트중에 기존의 두개의 테이블의 Unique한 값들을 외래키로 테이블을 생성하는 단계에서

ERROR 1005 (HY000): Can't create table `common_pjt`.`studenttable` (errno: 150 "Foreign key constraint is incorrectly formed")

 

이라는 문장과 studenttable의 외래키 제약조건이 잘못되었다는 메세지를 던진다.

위의 에러는 주로 3가지 상황에서 발생한다 .

 

1. 참조하는 외래키의 데이터 타입이 다른경우 

ex ) 기존은 varchar(30)인데 만들때 int(10) 이렇게 넣는경우 -> 발견하기 쉽다.

 

2. 참조하는 테이블의 pk,fk가 아닌경우

ex) 유니크한 값을 지정하지 않는경우 -> 역시 발견하기 쉽다.

 

1,2번은 금방 발견하니 다루지 않겠다..

3. 두 테이블의 charset , collation 값이 다른경우 ->

발견하기 어렵다 (개인적으로)

 

참조한 블로그 글을 소개하면,

 


https://cirius.tistory.com/1769

 

[MySQL] utf8 vs utf8mb4 차이는?

utf8 vs utf8mb4 차이는? MySQL, MariaDB, Postgresql, MSSQL, Oracle등등의 Database를 사용하면서 혹은 개발언어등에서 CHARSET = utf8로 세팅하고 사용한다. 언제부턴가 나는 MySQL, MariaDB를 사용할 경우 자..

cirius.tistory.com

http://blog.naver.com/PostView.nhn?blogId=kkforgg&logNo=220663890494

 

mysql error code : 1833 해결 방법

http://stackoverflow.com/questions/13606469/cannot-change-column-used-in-a-foreign-key-constraint 내...

blog.naver.com

https://kyeoneee.tistory.com/17

 

[MySql] 테이블의 character set 확인 및 변경

데이터를 다루다 보면 원하는 데이터로 가공을 하는 과정에서 join이 쓰이는 경우가 많다. 필자도 인턴을 하면서 데이터들을 다루다보면 분산되어 있는 데이터들을 하나의 원하는 데이터로 가

kyeoneee.tistory.com

 

 

위를 참고하여 해결하였다.

 

먼저 외래키로 참조하는 테이블의 인코딩과 각 컬럼의 collation값을 확인하자

 

show full columns from 테이블명

에서 참조하려는 두 테이블의 Collation의 값이 같아야하는데

 

 

이런것처럼 Collation이 다르다.. utf8mb4는 간단히 이모지기능을 추가한 인코딩방법이다..

무튼 이것을 해결하기위해 한쪽으로 맞추어주여야한다.

 

하지만 기존의 useremail이 또 다른 테이블의 외래키로 잡혀있어서 인코딩을 막 바꿀수 없는 경우가 존재하기 때문에,

 

Global하게 외래키 설정을 잠시 꺼두고 작업하고 다시키자,

SET FOREIGN_KEY_CHECKS = 0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;

여러가지 방법이 있겠지만 이방법이 가장 빠르다고 생각한다.

 

이후에 

 

alter table 테이블명 convert to character set utf8 collate utf8_general_ci;

의 명령어로 인코딩 방식과 collation값을 바꾸어 통일시키고 외래키 조건을 다시걸자..

 

테이블의 인코딩값과 외래키끼리의 Collation값이 같다면, 에러가 뜨지 않는다.

 

 

굿

Comments