[ MySQL ] Troubleshooting - 1

Min-Ho Lee·2021년 6월 23일
1

MySQL

목록 보기
1/2

🤯 Error 3780

posts 테이블과 comments 테이블이 있다고 가정하자.

(추후 사진 첨부 예정)

comments 테이블의 post_id의 FK 있고,
posts 테이블엔 post_id의 PK가 있을 것이다.

테이블 생성 시에, 참조를 위해 해당 커맨드를 입력하였다.

~ 생략 ~

FOREIGN KEY (`post_id`) REFERENCES `posts` (`post_id`) ON UPDATE CASCADE

~ 생략 ~

😩 TMI

나는 ON UPDATE CASCADE라는 옵션을 주었지만,
기본적으로 옵션을 주지 않으면 Default 값은 다음과 같다.

ON DELETE RESTRICT ON UPDATE RESTRICT

옵션에 대해서는 다음에 다뤄야겠다.

이렇게 참조를 하려고 하는데 에러가 났다.
에러 코드는 위 제목처럼 3780이다.

외래 키 제약조건(Foreign Key Constraint)에 걸린 것이다.

사실 이 부분에 대해서는 많은 경우의 수가 있어서 정확이 여기가 틀렸다라고 말을 할 수는 없다.

🤩 결론

일단 결론부터 말하자면, 나는 DB생성 시에, COLLATE 부분이 일치하지 않아 나는 에러였다.

나는 테이블을 생성 할때,
CALLATE에 utf8mb4_general_ci 라는 옵션을 준다.
그렇게 comments 테이블을 생성 했었는데,

SHOW CREATE TABLE posts;

로 posts 테이블을 확인해 봤더니, utf8mb4_0900_ai_ci 라는 옵션이 설정이 되어있어서 결론적으로 FK 제약에 걸린 것이다.

알고 봤더니, 테이블들이 아닌, DB를 생성할 당시에 COLLATE 옵션에 utf8mb4_0900_ai_ci 라는 옵션을 주어서 생성이 되었던 것이고,

내가 posts 테이블을 생성 할 당시에는 아무런 옵션을 주지 않아 Db의 기본 값인 utf8mb4_0900_ai_ci로 해당 posts 테이블에도 세팅이 되어있었던 것이다.

📝 간만에 회고

나는 기본적으로 Data Type이나 크기, Charset은 다 꼼꼼히 확인을 하는 편인데, Collate 하나로 이틀 동안 고생할줄은 몰랐다.

그래도 이렇게 몸소 느끼며 에러를 해결하고 정리하는 것이 확실히 기억에 오래 남는것 같다.

회사일이 바쁘다는 핑계로 블로그에 소홀했는데,
앞으로는 꾸준히 일주일에 1개라도 꼭 써야겠다.

profile
🐇 Rabbit can take a rest, but 🐢 turtle can't

0개의 댓글