Cannot delete or update a parent row: a foreign key constraint fails 에러 해결하기
데이터베이스 작업을 하던 중에 "Cannot delete or update a parent row: a foreign key constraint fails"라는 에러 메시지와 맞닥뜨렸다. 이 에러는 자주 겪는 일이 아니어서 당황했지만, 해결책을 찾아가며 많은 걸 배울 수 있었다.
에러와 마주하기
우선 문제의 원인을 파악하기 위해 테이블 관계를 살펴봤다. 내가 삭제하려던 caddy 테이블의 데이터가 golfbag 테이블에서 외래 키로 참조되고 있어서 문제가 발생한 것이었다. 데이터베이스에서는 이런 관계를 깨트릴 수 없기 때문에, 오류 메시지를 통해 나에게 경고를 해준 것이다. 사실 데이터 무결성을 유지하기 위해 필요한 기능이라는 걸 알면서도 순간 조금 불편하게 느껴졌다.
강제 삭제는 신중히
이 상황에서 빠르게 해결하려면 강제로 데이터를 삭제할 수도 있었다. 하지만 그렇게 하면 golfbag 테이블에 연결이 끊어진 데이터가 남아버릴 수 있다. 이렇게 고아 레코드가 생기면 나중에 큰 문제가 될 수도 있으니, 신중한 접근이 필요했다.
외래 키 제약 조건의 일시적 비활성화
고민 끝에 외래 키 제약 조건을 잠시 끄고 데이터를 처리하기로 했다. 이 방법은 마치 잠깐 안전장치를 해제하는 것과 같아서 그만큼 주의가 필요하다. SQL 명령어를 통해 외래 키 체크를 끄고, 필요한 작업을 처리한 뒤 다시 활성화하는 방식이다.
먼저 외래 키 체크를 끄는 명령어를 사용했다:
SET FOREIGN_KEY_CHECKS = 0;
그 후에 삭제 명령어를 실행했다:
DELETE FROM caddy WHERE id = ...;
작업이 끝난 후에는 반드시 외래 키 체크를 다시 켜야 한다:
SET FOREIGN_KEY_CHECKS = 1;
이 과정을 통해 데이터 무결성을 해치지 않으면서 안전하게 작업을 완료할 수 있었다.
이와 비슷한 작업을 posts_comment 테이블에서도 해봤다. 데이터를 삭제하고, 자동 증가 값(AUTO_INCREMENT)도 초기화했다.
mysql> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.01 sec)
mysql> DELETE FROM posts_comment;
Query OK, 286 rows affected (0.01 sec)
mysql> ALTER TABLE posts_comment AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.02 sec)
mysql> SET FOREIGN_KEY_CHECKS = 1;
데이터베이스 관리에서 외래 키 제약 조건은 무결성을 지켜주는 중요한 기능이다. 필요할 때 임시로 해제하는 방법을 알게 되었지만, 그만큼 신중하게 사용해야 한다는 것도 깨달았다. 앞으로는 데이터의 관계를 더 잘 이해하고, 작업을 계획적으로 수행해야겠다는 다짐을 했다.
오늘은 외래 키 제약 조건 덕분에 조금 고생했지만, 데이터베이스 관리 능력이 한층 더 성장한 날이었다.