본문 바로가기
Project Trouble Shooting/[EATceed] 몸무게 증량 어플

Foreign key constraint is incorrectly formed 에러 해결

by Big Sun 2023. 12. 31.
728x90

 

문제 발생

 

개발집 프로젝트를 배포 중 아래와 같은 오류를 만났다.

 

Error creating bean with name 'dataSourceScriptDatabaseInitializer' 
defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: 
Invocation of init method failed; 
nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: 
Failed to execute SQL script statement #8 of class path resource [db/schema.sql]: 

create table MEAL_FOOD_TB ( 
    MEAL_FOOD_PK bigint auto_increment primary key, 
    CREATED_DATE datetime(6) not null, 
    UPDATED_DATE datetime(6) not null, 
    FOOD_FK bigint null, 
    MEAL_FK bigint null, 
    constraint FKdipb7hg6jdu5764nq3wcnviua foreign key (FOOD_FK) references FOOD_TB (FOOD_PK), 
    constraint FKr2altmd95kev38n36mno92lsi foreign key (MEAL_FK) references MEAL_TB (MEAL_PK) 
); 

nested exception is java.sql.SQLException: 
(conn=1551) Can't create table `gaebaljip`.`MEAL_FOOD_TB` (errno: 150 "Foreign key constraint is incorrectly formed")

 

 

해당 오류는 외래 키 제약 조건에 문제가 있는 것을 알려준다.

 

 

필자는 위의 에러를 해결하기 위해 아래의 3가지를 확인하였다.

  1. 참조하는 외래키의 데이터 타입이 일치하지 않는 경우
  2. 참조하는 테이블 또는 참조 되는 컬럼이 존재하지 않는 경우
  3. 테이블의 charset, collation이 다른 경우

 

내 경우에는 3번째 케이스에 속하였다.

 

charset이란?

charset은 character set의 줄임말로, 데이터베이스가 문자를 어떻게 해석하고 저장할지 결정하는 규칙의 집합이다.

collation이란?

Collation은 데이터베이스에서 문자열을 비교하고 정렬할 때 사용하는 규칙의 집합이다.

이는 문자열의 대소문자 구분, 악센트 구분, 문자의 정렬 순서 등을 결정한다.

 

문제 해결

 

모든 테이블의 schema.sql의 charset과 collate설정을 통일하였다.

 

CREATE TABLE `MEAL_TB` (
   `MEAL_PK` bigint(20) NOT NULL AUTO_INCREMENT,
   `CREATED_DATE` datetime(6) NOT NULL,
   `UPDATED_DATE` datetime(6) NOT NULL,
   `MEAL_TYPE` varchar(255) NOT NULL,
   `MEAL_FOOD_MULTIPLE` double NOT NULL,
   `MEMBER_FK` bigint(20) DEFAULT NULL,
   PRIMARY KEY (`MEAL_PK`),
   KEY `FK5napxbpjxsev8lnx004fcrqrn` (`MEMBER_FK`),
   CONSTRAINT `FK5napxbpjxsev8lnx004fcrqrn` FOREIGN KEY (`MEMBER_FK`) REFERENCES `MEMBER_TB` (`MEMBER_PK`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

 

 

 

해결~

728x90