오픈초기에 테스트 했던 데이터를 삭제해 달라는 요청이 와서 진행 하려던중
RDB 제약조건중 무결성 보장하기위해 물리적으로외래키를 설정하여 아래와 같은 오류가 발생
오류 > SQL Error [1451] [23000]: Cannot delete or update a parent row: a foreign key constraint fails
해결방법으로는 아래와 같이 3가지정도가 존재하고 이번 삭제건에 대해서는 3번방법을 택했다.
1. 외래키 옵션해제
SET foreign_key_checks = 0;
옵션을 해제 후 삭제해야 할 테이블의 데이터를 삭제 후 옵션을 다시 활성화
SET foreign_key_checks = 1;
해당 기능을 사용할 시에는 정합성이 떨어질 수 있으므로 주위 해야한다.
2. CASCADE
외래키를 생성 할 시 외래키에 대한 제약옵션을 줄 수 있는고 종류는
CASCADE : 부모객체 A를 변경/삭제 시 A를 참조하는 모든 객체가 변경/삭제
RESTRICT,NO ACTION : A를 변경/삭제 시 A를 참조하고 있는 테이블이 존재하면 A 에대한 명령어가 취소
SET NULL : A 를 변경/삭제 시 참조 하고있는 모든 테이블의 A 값을 NULL 로 변경
기존 테이블에 존재하는 외래키를 드랍 후 해당 옵션을 주고 다시생성
alter table [테이블명] drop foreign key [constrainst에 설정한 외래키 별칭]
alter table [테이블명] add constraint [외래키 별칭] foreign key (외래키 적용할 컬럼명) references [부모테이블명] (참조할 컬럼) [옵션]
위에 방법은 이미 어플리케이션단 비지니스 로직에 다른 방법으로 삭제를 진행하는 로직들이 있어서 불가능
3. 참조테이블 하나씩 다 찾아서 삭제 (노가다)
툴은 DBeaver 를 사용하고 있었고 DBeaver 에서 데이터베이스 엔티티 관계도를 볼수 있는 기능을 제공하기에 최상위 테이블에서 외래키로 사용되는 컬럼을 선택하여 테이블 목록을 정리하고 삭제하기 시작했다.
아래 이미지처럼 최상위 테이블에서 다른 참조테이블에 사용중인 컬럼을 선택하면 색으로 표시된다.
위에 예시는 단순했지만 실제 프로젝트에서는 10개넘는 테이블이 있었다...
이방법이 안전은 하지만 제일 노가다이지만 안전성은 높은거 같다.
1,2,3 방법중 자신의 프로젝트에 맞는 방법을 선택
'데이터베이스 > MySql' 카테고리의 다른 글
DDL - CREATE 정리 (0) | 2022.09.20 |
---|---|
MySql 8.0 접속오류 Public Key Retrieval is not allowed (0) | 2022.09.14 |
댓글