2024. 1. 23. 16:09ㆍProject 우아한남형제들/데이터베이스
배경
문제는 'MEMBER' 테이블에 가데이터를 삽입하는 도중,
'ROLE_ID' 필드에 대한 "Unique index or primary key violation" 오류가 발생하면서 시작.
이 오류는 '사용자' 테이블의 'ROLE_ID'에 잘못 적용된 unique 제약조건 때문에 발생했습니다.
문제 해결을 위한 접근
https://stackoverflow.com/questions/10008476/dropping-unique-constraint-for-column-in-h2
MySQL 과는 다른 방법으로 unique 제약 조건을 찾아야 해
구글링을 했는데 대부분 다음과 비슷한 쿼리를 보여줍니다.
select distinct constraint_name from information_schema.constraints
where table_name='PUBLIC_PARTNER' and column_list='INFO'
하지만 이 같은 쿼리로 시도할 시 다음과 같은 에러가 납니다.
기존의 자료가 도움이 되지 않자, H2 데이터베이스의 내부 구조를 직접 탐구하기 시작했습니다.
글들을 보면 결국 INFORMATION_SCHEMA 스키마 안에서 정보를 찾아내는 방식이기에 같은 방법으로 찾아봤습니다.
해결 과정
이 중 INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE를 통해 제약 조건을 확인했습니다.
select *
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE;
이 중 MEMBER 와 ROLE_ID 관련 제약조건만 따로 추출하기 위해
다음과 같은 쿼리를 사용, 이름을 확인할 수 있었습니다.
select *
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
where TABLE_NAME = 'MEMBER' and column_name='ROLE_ID';
제약 조건 분석을 해보니 'ROLE_ID' 열에 외래 키 제약 조건과 유니크 제약 조건이 적용된 것을 발견했습니다.
이제 문제의 원인이 유니크 제약 조건이었으므로, 해당 제약 조건을 삭제했습니다.
ALTER TABLE MEMBER DROP CONSTRAINT CONSTRAINT_8;
결론
- 인터넷 검색을 통해 H2 데이터베이스의 unique 제약조건 해제 방법을 찾으려 시도했으나 성공하지 못함.
- `INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE` 뷰를 사용하여 'MEMBER' 테이블의 'ROLE_ID' 열에 적용된 유니크 제약 조건 확인.
- `ALTER TABLE` 명령을 사용하여 유니크 제약 조건(`CONSTRAINT_8`) 삭제, 문제 해결.