JPA/mySql 에러 - Cannot add or update a child row: a foreign key constraint fails

괭이밥·2023년 4월 10일

에러 해결

목록 보기
1/4

에러 발생 상황

entity 클래스에 연관관계를 추가하기 위해 다음과 같이 코드 작성 후, ddo-auto 설정을 update로 수정

entity 코드

public class Example extends BaseTimeEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id", nullable = false)
    private Member member;

application.yml

  jpa:
    database-platform: org.hibernate.dialect.MySQL8Dialect
    properties:
      hibernate:
        format_sql: true
        show_sql: true
    hibernate:
      ddl-auto: update #validate에서 수정

애플리케이션 실행, 에러 발생

  • GenerationTarget encountered exception accepting command : Error executing DDL

조사해보니, hibernate에서 자동으로 생성된 쿼리문이 DB 문법에 맞지 않거나, 변수에 예약어를 사용하면 주로 발생하는 에러였다. 하지만 나의 경우 두 경우 모두 확인했지만 해당되지 않는 케이스였다.



에러 해결 과정

먼저, DB 테이블 확인

  • example 테이블엔 member_id라는 이름으로 컬럼 생성되었음
  • 하지만 외래키 제약조건은 없었음

콘솔창을 열어 직접 외래키 제약조건 추가 시도

alter table example add constraint example_member
    foreign key (member_id) references member (member_id)

쿼리문 실행, 에러 발생

  • GenerationTarget encountered exception accepting command : Error executing DDL

에러 원인 파악

  • 이 블로그를 통해 나는 자식 테이블에 데이터가 존재하여 발생한 오류임을 알 수 있었음
  • example 테이블에 member_id 컬럼이 자동 생성되면서 기존 튜플에 member_id값은 0으로 채워짐
  • member 테이블 중 기본키가 0인 데이터가 없었음

최종 해결 방법

  • 외래키 제약조건 추가하려는 테이블의 데이터를 모두 삭제
    • example의 데이터는 중요한 데이터도 아니고, 개발 단계 테스트이므로 모두 삭제
  • 이후, 위의 외래키 제약조건 추가 쿼리문 실행 시 성공


참고
https://jongviet.tistory.com/41
https://sun-p.tistory.com/55

profile
개발도 하고 싶은 클라우드 엔지니어

0개의 댓글