H2 Database Unique 제약 조건 찾고 지우는 법

2024. 1. 23. 16:09Project 우아한남형제들/데이터베이스

728x90

배경

H2 console 에서 Unique Key 오류 발생

문제는 'MEMBER' 테이블에 가데이터를 삽입하는 도중,

'ROLE_ID' 필드에 대한 "Unique index or primary key violation" 오류가 발생하면서 시작.

회원 서비스의 ERD

이 오류는 '사용자' 테이블의 'ROLE_ID'에 잘못 적용된 unique 제약조건 때문에 발생했습니다.

문제 해결을 위한 접근

https://stackoverflow.com/questions/10008476/dropping-unique-constraint-for-column-in-h2

 

Dropping unique constraint for column in H2

I try to drop unique constraint for column in h2, previously created as info varchar(255) unique. I tried: sql> alter table public_partner drop constraint (select distinct unique_index_name fr...

stackoverflow.com

MySQL 과는 다른 방법으로 unique 제약 조건을 찾아야 해

구글링을 했는데 대부분 다음과 비슷한 쿼리를 보여줍니다.

select distinct constraint_name from information_schema.constraints 
where table_name='PUBLIC_PARTNER' and column_list='INFO'

하지만 이 같은 쿼리로 시도할 시 다음과 같은 에러가 납니다.

from 에 적은 테이블은 없는 테이블이다.

기존의 자료가 도움이 되지 않자, H2 데이터베이스의 내부 구조를 직접 탐구하기 시작했습니다.

글들을 보면 결국 INFORMATION_SCHEMA 스키마 안에서 정보를 찾아내는 방식이기에 같은 방법으로 찾아봤습니다.

해결 과정

INFORMATION_SCHEMA 내부 CONSTRAINT 관련테이블들

이 중 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';

FK, Unique 2가지임을 확인

제약 조건 분석을 해보니 'ROLE_ID' 열에 외래 키 제약 조건과 유니크 제약 조건이 적용된 것을 발견했습니다.

 

이제 문제의 원인이 유니크 제약 조건이었으므로, 해당 제약 조건을 삭제했습니다.

ALTER TABLE MEMBER DROP CONSTRAINT CONSTRAINT_8;

제대로 삭제됨

결론

  • 인터넷 검색을 통해 H2 데이터베이스의 unique 제약조건 해제 방법을 찾으려 시도했으나 성공하지 못함.
  • `INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE` 뷰를 사용하여 'MEMBER' 테이블의 'ROLE_ID' 열에 적용된 유니크 제약 조건 확인.
  • `ALTER TABLE` 명령을 사용하여 유니크 제약 조건(`CONSTRAINT_8`) 삭제, 문제 해결.
728x90