에러 원인
MySQL에서 row를 삭제하려고 하는데 다음과 같은 에러가 발생했다.
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
현재 삭제하려고 하는 row를 다른 테이블에서 참조하고 있기 때문에 삭제하거나 변경할 수 없다는 것이다.
에러 해결
방법1) 참조하는 데이터를 먼저 삭제하고 삭제하기
FK로 참조하는 row를 삭제한 뒤 에러가 발생했던 row를 다시 삭제해주면된다.
이 방법이 가장 안전한 방법으로, 기존 DB 설계자가 의도한 대로 데이터의 관계를 유지할 수 있다는 장점이 있다.
방법2) 외래키 체크 설정을 해제하기
-- 외래키 체크 해제(0)/설정(1)
set foreign_key_checks=0;
set foreign_key_checks=1;
외래키 체크 설정을 해제하고 해당 row를 삭제할 수 있다.
다만 테이블 간의 관계를 일시적으로 해제하고 데이터를 삭제하는 것이기 때문에 기존 테이블 간의 관계를 보장할 수 없게 된다.
예를 들어 Member의 member_id를 참조하는 Post가 있을때,
member 데이터를 삭제했을 때 해당 member를 참조하는 post 데이터도 사라지도록 foreign key 설정이 되어 있다고 생각해보자.
만약 이러한 상황에서 외래키 체크 설정을 해제하고 member 데이터를 지운뒤 다시 설정을 활성화 하면 post에는 여전히 member_id 정보가 남게되는 것이다.
따라서 로컬이나 테스트 서버일 때 강제로 데이터를 지워야하는 상황에만 주의하여 사용해야 한다!
추가
외래키 체크를 해제 설정했지만, 또 다른 에러가 발생했다.
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences
찾아보니 이 에러는 update 또는 delete 할 때 where 절이 없을 경우, 즉 한번에 여러 row를 변경할 때 막아주는 Safe Mode가 설정되어 있기 때문에 발생하는 에러였다.
Safe Mode를 해제하고 다시 삭제를 진행하니 간단하게 해결되었다!
-- Safe Mode 설정 해제(0)/설정(1)
set sql_safe_updates=0;
set foreign_key_checks=0;