무결성 제약조건이 위배되었습니다- 부모 키가 없습니다


테이블에 데이터를 insert를 하는 테스트 코드를 작성하다가
무결성 제약조건이 위배되었습니다- 부모 키가 없습니다
에러가 발생했다.

에러의 원인

테스트 코드의 데이터 생성시,
부모 테이블에서 참조하는 컬럼의 값인 Foreign Key값은
부모 테이블에 먼저 존재해야만 참조 가능하다.

참조하려고 하는 부모 테이블의 컬럼 값이 존재하지 않기 때문에
부모 키가 없다는 에러가 발생한 것이다.

해결 방법

Foreign Key로 사용되는 컬럼 값을 부모 테이블의 컬럼에 먼저 생성한 후,
생성된 해당 키값을 자식 테이블에서 참조할 수 있도록 데이터를 넣어준다.


외래키 제약 조건

테이블에 제약을 설정하여 저장될 데이터를 제한할 수 있다.
이 중 외래키 제약 조건에 대해 알아보자.

외래키(FOREIGN KEY)는 여러 개의 테이블 사이에서 데이터의 정합성을 유지하기 위해 설정한다.
테이블 사이에 부모 자식과 같은 관계를 가지면서 정합성을 유지한다.
자식 테이블 측에서는 외래키(FOREIGN KEY)를 지정하여 부모 테이블을 참조한다.

  • 부모 테이블에서 참조될 열은 반드시 유일성(UNIQUE KEY, PRIMARY KEY)를 가진다.
  • 부모테이블의 PK, UK를 참조하는 자식테이블의 컬럼을 외래키 컬럼이라 하며,
    부모 테이블의 컬럼을 참조 키라고 한다.

UML과 표로 정리해보자

부모 테이블: 회원, 상품
자식 테이블: 주문

자식 테이블 (주문) 부모 테이블(회원, 상품)
INSERT 부모 테이블의 PK or NULL만 입력 가능 참조키만 충돌나지 않으면 입력 가능
UPDATE 부모 테이블의 PK or NULL로 변경 가능 변경을 원하는 참조키가 자식 테이블의 외래키 컬럼에 없을 때 가능
DELETE 가능 삭제를 원하는 참조키가 자식 테이블의 외래키 컬럼에 없을 때 가능
DELETE CASCADE 가능 가능

참고