[ 트러블 슈팅 ] SQL Error [1451] [23000]

Do_It·2023년 12월 21일
0

트러블슈팅

목록 보기
4/4
post-thumbnail

JPA를 쓰면 엔터티 클래스를 정의하게 되고 hibernate는 엔터티 클래스를 바탕으로 DDL을 사용하여 데이터베이스에 자동으로 테이블을 만든다.

cardioEx의 엔터티 클래스를 보면 workout 엔터티의 Id가 외래키로 설정되어 있음 알 수 있다.

그러면 workout 테이블에서 cardioEx가 있는 레코드를 삭제하면 어떻게 될까?

Error synchronizing data with database

Reason:
SQL Error [1451] [23000]: Cannot delete or update a parent row: a foreign key constraint fails (`todayex`.`cardio_ex`, CONSTRAINT `FK9ot1p6mywqrojfauvwjaaqwb` FOREIGN KEY (`workout_id`) REFERENCES `workout` (`idx`))

에러가 뜬다. 왜 그럴까?
JPA는 외래키 설정시 기본적으로 삭제 조건 명시하지 않으면 NO ACTION이나 RESTRICT가 적용된다.

정말일까?

On Delete나 On Update시 Restrict로 되어 있음을 볼 수 있다.

이제 이것을 변경하면 된다. 물론 경우의 따라서 다르다. 이번 프로젝트의 경우 workout 데이터를 삭제시에 해당 cardioEx데이터를 삭제하는게 맞다고 판단했기에 castcade로 바꾸는 것이다.

바꾼 후 세이브를 클릭하고 workout 테이블에서 레코드를 삭제하면 에러 없이 삭제됨을 볼 수 있다.

오늘 배운 것들

데이터 삭제나 업데이트 시 어떻게 할지도 정하는 것도 매우 중요함을 배웠다. 만약 내가 restrict 상태에서 이 서비스를 배포했다면, workout 삭제가 안되서 매우 어처구니 없는 상황을 맞이했을 것이다.. ㅎㄷㄷ..

참고 자료

https://www.youtube.com/watch?v=c8WNbcxkRhY&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=3

profile
오늘의 노력이 내일의 성장으로 이어지고 있음을

0개의 댓글

관련 채용 정보