티스토리 뷰

728x90

Cannot delete or update a parent row: a foreign key constraint fails를 검색해보다가 

다들 workbench에 강제적으로 삭제하라는 말 밖에 없어서 글을 작성하게 되었습니다.

 

[에러발생 문구]

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

2. ` FOREIGN KEY (`review_id`) REFERENCES `tb_debate_review` (`review_id`))

3. a foreign key constraint fails (`community`.`tb_review_member`, CONSTRAINT `FKbxh8q7ql121fkgy4cvrq1hecc` FOREIGN KEY (`review_id`) REFERENCES `tb_debate_review` (`review_id`))

 

 

1. 오류가 발생한 이유


테이블을 쿼리로 직접 삭제할 때 예외가 걸렸다. 

왜냐하면 테이블 삭제 시 관계가 되어있는 두 개 이상의 테이블의 관계가 걸려 있기 때문이다.

테이블을 참조하게 되는 불안정한 이상 상태가 되어 DBMS에서 사전에 방지를 해주는 것인데, (ORMdml cascade 지정 설정으로 삭제가 되기도 함) 이를 무시하고 강제로 삭제를 하려고 할 때 오류 메시지를 보여준다.

member(자식)테이블의 컬럼을 삭제하려고 했을때 외래키의 무결성 제약조건에 위배 되어 발생한 오류이다.

 

 

2. 해결 방법


[1. 강제적인 삭제 방법]


1. foreign key 체크 설정을 비활성화하고
2. 테이블을 삭제시킨다.
3. 테이블 삭제 후 다시 foreign key 체크를 활성화하여 안전성을 지켜주면 된다.

 

[2. 고아객체를 선언하기]

entity객체의 @onToMany에 선언하기

orphanRemoval = true

club과 members가 관계 매핑이 걸려 있어 Cannot delete or update a parent row: a foreign key constraint fails가 발생했다.

 

@OneToMany(mappedBy = "club",  orphanRemoval = true)
@JsonBackReference
private List<ClubMember> members;

주인/종의 관계는

@ManyToOne인 club이 주인이고, @OneToMany인 members가 종이다.

 

orphanRemoval = true를 종에게 선언해서 부모엔티티가 삭제되면 자식 엔티티도 삭제된다.

따라서 CascadeType.PERSIST를 함께 사용하면, 부모가 자식의 전체 생명 주기를 관리한다.

 

 

혹시 더 좋은 방법이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.

 

728x90
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday