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 잘만 사용 중이었는데...? 잘 됐는데...!)
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;
왜 안될까...를 생각하다가 그냥 하나의 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);
그러면 아래 이미지와 같이 오류없이 잘 들어간다!