DB Check 제약조건 오류 해결기
Check constraint 'user_chk_1' 오류를 분석하고, enum 타입 전환 이후 발생한 MySQL 제약 조건 이슈를 해결한 과정
2025.05.21
갑자기 날아온 디엠...
- 이미 몇일 전 로컬에서 봤던거라 어떻게든 해결할 수 있다는 자신감의 답장 “넵넵~”
문제 상황
- 카카오 로그인을 하는데 아래와 같은 에러가 뜸.
{
"code": "DB_ACCESS_ERROR",
"message": "데이터베이스 오류 발생: could not execute statement [Check constraint 'user_chk_1' is violated.] [/* insert for com.even.zaro.entity.User */insert into user (birth_date, created_at, email, follower_count, following_count, gender, last_login_at, live_alone_date, mbti, nickname, password, profile_image, provider,provider_id, status, updated_at) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]",
"data": null
}
- 잘못된 제약 조건이 들어가 있는 것.
- provider가 0, 1로 되어있는 걸 enum(string)으로 수정한 적이 있는데 이 이후로 이 에러가 나타남.
- 처음에 로컬 db에서 나타나서 제약조건을 없애 버렸음.
- 서버에서 같은 에러가 난다는 제보를 받고 확인 해봄. 서버라 제약 조건을 없애는 건 아닌 것 같아서 수정하는 방향으로 해결함.
해결
- 우선 어떤 제약 조건이 있는지 확인
USE evendb;
SHOW CREATE TABLE user;
- 아래는 output
CREATE TABLE user (
id bigint NOT NULL AUTO_INCREMENT,
birth_date date DEFAULT NULL,
created_at datetime(6) NOT NULL,
email varchar(255) NOT NULL,
follower_count int DEFAULT NULL,
following_count int DEFAULT NULL,
gender varchar(255) DEFAULT NULL,
last_login_at datetime(6) DEFAULT NULL,
live_alone_date date DEFAULT NULL,
mbti varchar(4) DEFAULT NULL,
nickname varchar(255) NOT NULL,
password varchar(255) DEFAULT NULL,
profile_image varchar(255) DEFAULT NULL,
status enum('ACTIVE','DELETED','DORMANT','PENDING') NOT NULL,
updated_at datetime(6) DEFAULT NULL,
provider enum('LOCAL','KAKAO') NOT NULL,
provider_id varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY UKob8kqyqqgmefl0aco34akdtpe (email),
UNIQUE KEY UKavppunt4c0qpxo9giv18an98o (provider,provider_id),
**CONSTRAINT user_chk_1 CHECK ((provider between 0 and 1)**)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CONSTRAINT user_chk_1 CHECK ((provider between 0 and 1))
이 부분이 문제
ALTER TABLE user
DROP CHECK user_chk_1;
ALTER TABLE user
ADD CONSTRAINT user_chk_1 CHECK (provider IN ('LOCAL', 'KAKAO'));
- 기존 제약 조건을 없애고, 수정된 제약 조건을 넣음.
- 기존
0
,1
→LOCAL
,KAKAO
로 수정
- 기존
배운 점
이제 제약 조건 따위 두렵지 않다.