본문 바로가기
오늘의 삽질... 에러모음

[MySQL] Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails...

by 요호유후 2025. 1. 22.
반응형

 

오늘의 에러2...

 

 

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails

 

 

에러사항

실습 문제 풀이 중 아래와 같이 에러가 발생했다.

실습 문제)

배우 ID가 10인 배우의 정보를 삭제하시오. 
작성한 쿼리문)

DELETE FROM actor WHERE actor_id = 10

 

actor_id 가 10에 해당하는 데이터를 삭제하려 했는데 아래와 같은 에러가 떴다.

에러)

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`sakila`.`film_actor`, CONSTRAINT `fk_film_actor_actor` FOREIGN KEY (`actor_id`) REFERENCES `actor` (`actor_id`) ON DELETE RESTRICT ON UPDATE CASCADE)

 

 

에러원인

이는 다른 테이블에 해당 데이터를 참조하고 있는 FK(Foreign Key, 외래키)가 존재 하기 때문!

해당 에러는 DELETE, UPDATE 시 발생할 수 있다.

아래 이미지와 같이 테이블 film_actor의 actor_id가 테이블 actor의 actor_id를 참조하고 있다.

Table. film_actor, Table. actor의 관계
(좌) Table.film_actor, (우) Table.actor

 

 

해결

이때 해결 방법으로는,

1. 지우고 싶은 데이터와 연결되어 있는 다른 테이블의 데이터를 전부 지워준다.
2. foreign_key_checks = 0을 사용하여 FK제약을 임시로 해제한다.
   (사용 후 무.조.건 foreign_key_checks = 1을 해줘야한다. 무!조!건)

+
cascade (정리해보기)
cascade 옵션을 사용하면 PK가 지워지면 해당 PK를 FK로 참조하는 데이터들도 연계되어 삭제가 된다.
고한다...

참고링크 : https://great-woman-hoseung.tistory.com/56
1번 : 연결된 데이터를 먼저 삭제해준다.

DELETE FROM film_actor WHERE actor_id = 10;
DELETE FROM actor WHERE actor_id = 10;

1번

 

2번 : 쿼리문 위 아래 라인에 foreign_key_checks 를 비활성/활성 해준다.

SET foreign_key_checks = 0;
DELETE FROM actor WHERE actor_id = 1;
SET foreign_key_checks = 1;

2번

 

+ foreign_key_checks 사용 시 주의사항

foreign_key_checks 의 설정은 FK 제약과 상관없이 쿼리문을 수행하게 해준다.
따라서, 이후 실행된 쿼리문들이 FK제약에 위반된 테이블 혹은 데이터를 생성할 수 있다는 것!!

그래서
1. 단순 테스트 코드나 일회성? 코드를 작성할 때 사용하거나
2. FK제약에 위반된 테이블 혹은 데이터를 생성한 후 위반사항들을 처리해주자!
    (예를 들어 자식테이블에 부모테이블에 없는 값을 억지로? 생성/갱신 하였다면,
      이후 부모테이블에도 해당값을 데이터로 생성해주자!)
반응형

댓글