본문 바로가기

Data Base

DB- 테이블 외래키 제약조건

외래키 제약 조건

 이번에 개인 프로젝트를 진행하면서 엔티티간 연관관계를 매핑하는데 있어서 단순히 객체로서의 매핑 관계 뿐만 아니라 DB에서 테이블로서의 연관관계에 대한 이해도 필요하단 점을 느껴서 따로 정리를 하게 되었다.

 

 일단 외래키 제약조건의 정의는 다음과 같다.

"외래키 제약조건은 한 마디로 말해서 두 테이블간의 관계를 선언하여 데이터간의 무결성을 보장해주는 역할"을 위한 제약이다. 여기서 중요한 점은 무결성이다. 이는 간단히 말해서 테이블간의 연관관계를 설정할 때 엉뚱한 값이 연결되지 않도록 한다는 것이다. 

 

 외래키 제약조건은 관계형 데이터베이스에서 데이터의 일관성과 무결성을 보장하기 위해 사용한다. 이러한 제약조건은 다음과 같은 목적으로 존재한다:

1. **데이터 무결성 유지:** 외래키 제약조건은 데이터베이스 내의 관련된 테이블 간의 일관성을 유지하도록 도와줌. 참조된 테이블의 데이터가 올바르고 정확한 값만 참조되도록 보장함.

2. **데이터 일관성:** 외래키 제약조건은 데이터의 논리적 일관성을 유지하기 위해 사용됨. 관련된 테이블 간의 데이터 일치성을 유지하며, 부모 테이블의 변경이 자식 테이블에도 올바르게 반영되도록 함.

3. **데이터 무결성 검사:** 외래키 제약조건은 잘못된 데이터 입력을 방지함. 부모 테이블에 존재하지 않는 값을 자식 테이블에 삽입하려는 시도를 방지하여 데이터의 무결성을 검사.

4. **데이터 정합성 유지:** 외래키 제약조건은 테이블 간의 정합성을 유지하는 데 도움을 준다. 부모 테이블의 데이터가 변경되거나 삭제될 때, 관련된 자식 테이블의 데이터에 대한 적절한 조치를 취하여 데이터 정합성을 유지.

5. **데이터 조작 제어:** 외래키 제약조건은 테이블 간의 데이터 조작을 제어하여 관계형 데이터베이스의 정확성과 일관성을 보장.

예시

 예를 들어서 테이블 MEMBER와 TEAM이 존재한다고 하자. 이 둘은 다대일 관계로 매핑되어 있고, 연관관계 주인은 MEMBER가 되어 MEMBER가 TEAM의 fk를 가진다.

 

 이때 MEMBER 엔티티 member1,member2,member3가 team1이라는 엔티티에 리스트의 형태로 매핑되었다고 해보자. 그 경우 테이블 MEMBER에는 team1의 외래키를 가지는 row(member1,2,3)가 세 개 존재할 것이다.

member1,2,3와 team 엔티티의 테이블상 매핑 관계

만일 이 경우에 "delete from TEAM t where t.team_id = team1의 기본키 값" 와 같이 team1을 데이터 베이스에서 삭제하기 위한 delete sql을 날린다면 어떻게 될까?

외래키 제약조건 위반으로 인한 에러

 보다시피 외래키 제약조건의 위반으로 인해서 제거가 되지 않는다는 것을 알 수 있다. 사실 이는 너무 당연한 것인데, TEAM을 참조하는 MEMBER들의 경우 외래키로 team을 참조하고 있기에 50이라는 team 아이디를 필드로서 들고 있는 상태이다. 그런 상황에서 50의 기본키를 가지는 TEAM 테이블의 row를 삭제한다면 member들이 가지고 있는 TEAM_ID는 사실 그 어디에도 존재하지 않는 필드의 외래키를 가지고 있는 것이다.이는 데이터의 무결성을 침해하는 행위로 외래키 제약조건에 목적에 위반된다. 따라서 DB에서는 이러한 명령을 거부하게 된다.

 

연관관계 해제

 그렇다면 만일 이렇게 한번 매핑이 되었다면 member들을 제거할 수 없을까? 당연히 그렇지는 않다.

이 경우에는 제거하고자 하는 필드들 간의 연관관계를 해제해주면 된다. 각 member들은 team의 외래키를 들고 있고 이 때문에 서로 간의 연관관계가 매핑이 되어있는데 이 때 member들의 TEAM_ID 필드를 null로 바꿔주거나 외부키가 아닌 다른 값으로 바꾸게 된다면(물론 다른 필드의 외래키로 설정하게 된다면 제거 불가) 제거가 가능하게 될 것이다.

team_id를 50에서 null로 update해서 연관관계 해제

TEAM_ID가 null로 변경된 MEMBER 테이블의 row들의 경우 정상적으로 삭제가 가능하다.

 

 

아래는 프로젝트로 진행했던 병원 예약 시스템에서의 외래키 제약조건 예제에 대한 정리이다.

'Data Base' 카테고리의 다른 글

Mysql- 권한 설정  (0) 2024.02.27