[MySQL] 기존 UQ를 Drop 후 새로운 UQ를 Add할 때, Cannot drop index '': needed in a foreign key constraint 오류가 뜬다면.

Walter Mitty·2024년 3월 27일
0

서론

DBeaver를 통해 MySQL DB를 사용하고 있다. 조회의 성능을 위한 인덱스키와 중복 방지를 위한 유니크키(UQ)를 사용하고 있는데, UQ를 메뉴얼로 수정하려니까 해당 기능이 없어보여 UQ 삭제 후 다시 생성해주려고 했는데 에러가 발생했다. 해당 에러를 해결(?)한 방법이다.

본론

내가 말하는 메뉴얼로 수정•삭제•추가란 아래 이미지와 같이 DBeaver에서 직접 삭제하는 것을 말한다.

그럼 아래와 같은 명령문이 뜨면서 persist를 할 수 있는 창이 뜰텐데,
persist를 누르면 에러가 발생했다.

ALTER TABLE {DB명}.{테이블명} DROP KEY {삭제를 원하는 제약조건명};

참고로 아래 명령어를 차례로 실행해도 오류가 났다.

ALTER TABLE {DB명}.{테이블명} DROP KEY {삭제를 원하는 제약조건명};
ALTER TABLE {DB명}.{테이블명} ADD CONSTRAINT {등록을 원하는 제약조건명} UNIQUE KEY (UQ에 들어갈 컬럼들);

에러 내용

Cannot drop index '': needed in a foreign key constraint

검색을 하다 보니 innoDB에서는 unique index 삭제 전에 외래키를 꼭 삭제해주어야한다고 한다. (왜..? 다른 UQ에서도 FK 잘만 사용 중이었는데...? 잘 됐는데...!)

해결 시도 1 (실패)

FK에 대한 DDL을 끄고 하면 된다고 해서 해봤는 대실패
(참고로 FOREIGN_KEY_CHECKS=0이면 FK에 대한 조건을 off,
FOREIGN_KEY_CHECKS=1이면 FK에 대한 조건을 on을 뜻한다)

SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE {DB명}.{테이블명} DROP KEY {삭제를 원하는 제약조건명};
SET FOREIGN_KEY_CHECKS=1;

해결 시도 2 (성공)

왜 안될까...를 생각하다가 그냥 하나의 ALTER문에 DROP과 동시에 ADD를 넣어볼까? 하고 실행해봤다

ALTER TABLE {DB명}.{테이블명} DROP KEY {삭제를 원하는 제약조건명},
ADD CONSTRAINT {등록을 원하는 제약조건명} UNIQUE KEY (UQ에 들어갈 컬럼들 넣어주시면 됩니다.);

실제 예제는 아래처럼!(참고용입니다)

ALTER TABLE test.testChart DROP KEY UQ_testChart_1,
ADD CONSTRAINT UQ_testChart_1 UNIQUE KEY (courseInfoId,chartType,chartRound);

그러면 아래 이미지와 같이 오류없이 잘 들어간다!

0개의 댓글

관련 채용 정보