2014-09-19 4 views
3

자체 참조하는 외래 키가있는 MySQL 테이블이 있습니다. ON DELETE CASCADE는 완벽하게 작동하지만 부모 엔티티에 대해 최대 14 레벨까지만 작동한다는 이상한 행동을 발견했습니다. 마자는 15 레벨의 자녀를 추가하고 오류를 던지기 시작 부모를 삭제하려고으로DELETE CASCADE에서 15 레벨을 초과하는 자체 참조 MySQL 테이블에서 오류가 발생합니다.

: 여기

이미지입니다 "삭제하거나 부모 행을 업데이트 할 수 없습니다 외래 키 제약 조건 실패" 계층 구조.

enter image description here

는 오류가 발생합니다 부모를 삭제하려고합니다. 나는 자식 1 다음 성공적으로 삭제됩니다 삭제하려고하면
  • Child15 삭제에, 부모, Child15을 삭제하지 않고
  • 을 삭제할 수 있습니다.

동작을 재현하는 샘플 스키마는 here입니다. 스키마를 빌드하기 전에 id = 2 대신 id = 1 인이 쿼리 라인을 붙여 넣으십시오.

DELETE FROM table1 WHERE id = 1;

을 삭제하는 동안

나는 가능한 해결 방법가 바닥을 이동

  • SET의 FOREIGN_KEY_CHECKS = 0
  • 처럼 삭제 알고 있지만 나는이 몇 가지 알려진 제한 사항입니다 알고 싶어요 ON CASCADE DELETE에 대한 MySQL 사용

    내가 MySQL 서버 버전 5.6

답변

5

을 사용하고이 설명되어 동작 :

ON UPDATE CASCADE 또는 ON UPDATE SET NULL 재귀가 이전에 겹쳐 놓기 동안 업데이트 된 같은 테이블을 업데이트하는 경우, 그것은 RESTRICT와 같은 역할을합니다. 즉, 자체 참조 ON 업데이트 CASCADE 또는 ON UPDATE SET NULL 작업을 사용할 수 없습니다. 이는 계단식 업데이트로 인한 루프가 무한한 번 발생하지 않도록하기위한 것입니다. 반면에 자기 참조 ON DELETE SET NULL이 가능하며 자체 참조 ON DELETE CASCADE와 마찬가지로 가능합니다. 계단식 작업은 레벨이이상이 아닌 중첩되지 않을 수 있습니다.

출처 : InnoDB and FOREIGN KEY Constraints, Referential Actions