퇴근하고 사이드프로젝트를 하던중 insert시 ERROR 3819 (HY000): Check constraint '' is violated 오류를 만나게 되었다.

나는 SpringBoot + JPA + Mysql을 이용해서 회원가입 기능을 개발하는 도중에 발생하였다.

 

에러 의미부터 해석하자면 테이블의 제약조건에 위반된 쿼리를 날리려고 했다? 정도로 해석 할 수 있다.

 

그래서 나는 열심히 로그를 봤다. (로그의 가독성을 위해서 쓸데없는 시간같은 내용은 잘랐다)

insert into member (gender,id,name,password,phone,role,member_id) values (?,?,?,?,?,?,?)
insert into member (gender,id,name,password,phone,role,member_id) values ('MALE','test','test','test','010','USER',1);
SQL Error: 3819, SQLState: HY000
Check constraint 'member_chk_1' is violated.
took 0ms | rollback | connection 3|

분명 로그를 봤을땐 아무 문제 없이 쿼리가 만들어서 나갔지만 SQL Error: 3819, SQLState: HY000 오류가 발생하였고 롤백을 당했다..

 

이런 상황일때는 일단 테이블에 제약조건이 어떻게 걸려있는지 확인해야한다.

SELECT * FROM information_schema.check_constraints;

다음과 같은 쿼리로 테이블의 제약조건을 확인할 수 있다.

나는 다음과 같은 제약조건이 걸려있었다. role 컬럼의 값은 0이나 1이 되어야 한다는 check 제약조건이였다.

insert into member (gender,id,name,password,phone,role,member_id) values ('MALE','test','test','test','010','USER',1);

그런데 난 컬럼을 ADMIN 또는 USER가 들어가는 enum 컬럼으로 지정해놨고 @Enumerated(EnumType.STRING)도 지정해놨다.

 

그때 갑자기 기억이 머리를 스쳐지나갔다. 처음에 실수로 @Enumerated 모드를 지정을 안했던것이다. 

그러면 기본적으로 ORDINAL 모드로 지정이 되고 0,1로 처리하게 되면서 저런 제약 조건이 생겨버린것이다.

해결방법

크게 꼬인 문제가 아니라면 제약조건만 삭제해줘도 된다. 또한 나의 상황에 맞게 제약조건을 새로 설정해주었다.

또한 해결이 어렵다 싶으면 최후의 수단으로 database를 날리고 다시 생성해줘도 된다.

ALTER TABLE member DROP CONSTRAINT '제약조건명';
ALTER TABLE member ADD CONSTRAINT member_chk_role CHECK (role IN ('ADMIN', 'USER'));

 

반응형
복사했습니다!