티스토리 뷰

문제

특정 컬럼을 삭제하려고 하는데 다음의 문장으로 시작하는 외래키 참조조건 에러가 남

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

여러 복잡한 참조 제약조건을 걸어서 부모 행을 삭제할 수 없는 상황

 

시도 및 해결

아래 설정을 통해 FOREIGN_KEY_CHECKS를 1로 값을 변경하면 삭제가 가능함

SET FOREIGN_KEY_CHECKS=0; -- to disable them
SET FOREIGN_KEY_CHECKS=1; -- to re-enable them

그러나 데이터일관성을 위해, 개발할 때만 잠시 적용하고 다시 0으로 값을 되돌리는 것이 좋음

 

알게된 점

외래키 참조 제약조건 (referential actions)

Foreign key (외래키)에 적용할 수 있는 ON DELETE and ON UPDATE 옵션

 

예. ON DELETE

 

- ON DELETE CASCADE: 참조된 상위(부모) 테이블의 행이 지워지면, 참조하고 있는 하위(자식) 테이블에 일치하는 모든 행이 삭제 됨

- ON DELETE SET NULL: 참조된 상위(부모) 테이블의 행이 지워지면, 참조하고 있는 하위(자식) 테이블의 모든 행의 FK 컬럼이 null로 변경됨 (단, Null 이 가능해야 함)

- ON DELETE SET DEFAULT: 참조된 상위(부모) 테이블의 행이 지워지면, 참조하고 있는 하위(자식) 테이블의 모든 행의 FK 컬럼이 해당 컬럼의 기본값으로 변경됨

- ON DELETE RESTRICT: 참조된 상위(부모) 테이블의 행의 행의 삭제를 금지함

- ON DELETE NO ACTION : 어떠한 삭제 참조 액션이 없음. 특정 제약조건을 지정할 때만 적용됨

 

참고자료

MySQL :: MySQL 5.7 Reference Manual :: 13.1.18.5 FOREIGN KEY Constraints

Cannot delete or update a parent row: a foreign key constraint fails

Good explanation of cascade (ON DELETE/UPDATE) behavior

댓글