💡 핵심 인사이트
외래 키(Foreign Key)는 내 테이블의 특정 속성(열)이 다른 부모 테이블의 '기본 키(PK)'를 훔쳐보며(참조하며), 두 테이블을 운명 공동체로 연결(Join)해 주는 강력한 연결고리입니다.
관계형 데이터베이스(RDBMS)에서 '관계(Relation)'를 물리적으로 형성하고 무결성을 지키는 가장 핵심적인 열쇠입니다.


Ⅰ. 외래 키의 탄생 배경 (관계 맺기)

쇼핑몰에서 주문 테이블을 만들 때, 이 물건을 산 사람이 '홍길동(나이 30, 서울 거주)'이라는 것을 기록해야 합니다.

  • 나쁜 설계: 주문 테이블에 (주문번호, 물건명, 홍길동, 30세, 서울)을 다 적어 넣으면 데이터 중복과 이상 현상이 발생합니다.
  • 좋은 설계 (FK 도입): 고객 정보는 별도의 회원 테이블에 몰아넣습니다. 그리고 회원 테이블의 대장인 **기본 키(회원번호: 1001)**만 쓱 가져와서 주문 테이블에 적어둡니다. 이때 주문 테이블에 적힌 '회원번호(1001)'라는 컬럼이 바로 **외래 키(Foreign Key)**입니다. "이 번호의 진짜 주인(상세 정보)은 저쪽 회원 테이블에 가서 찾아보세요"라는 이정표 역할을 합니다.

Ⅱ. 외래 키의 특성과 참조 무결성

외래 키는 혼자 독립적으로 존재할 수 없습니다. 항상 **'참조하는 자(자식 테이블)'**와 **'참조되는 자(부모 테이블)'**의 상하 관계가 형성됩니다.

[ 부모: 회원 테이블 ]                       [ 자식: 주문 테이블 ]
회원번호(PK) | 이름   | 나이               주문번호(PK) | 주문상품 | 회원번호(FK)
-------------|--------|-----               -------------|----------|--------------
   1001      | 홍길동 | 30                 A001         | 노트북   | 1001 
   1002      | 김철수 | 25                 A002         | 마우스   | 1001
   1003      | 이영희 | 28                 A003         | 키보드   | 9999 (오류!)

참조 무결성 (Referential Integrity) 제약조건

이 두 테이블이 끊어지지 않도록 DB 엔진이 목숨 걸고 지키는 절대 규칙입니다.

  1. 외래 키에 들어갈 값은 반드시 부모 테이블의 기본 키(PK)에 존재하는 값이어야 합니다.
    • 주문 테이블에 회원번호: 9999를 넣으려 하면, 부모 테이블에 9999번 회원이 없으므로 DB가 에러를 뿜으며 삽입(INSERT)을 강제로 막아버립니다. (유령 회원 주문 방지).
  2. NULL 값의 허용: 외래 키는 기본 키(PK)와 달리 NULL 값이 허용됩니다. (아직 회원이 할당되지 않은 비회원 주문 등 로직에 따라 비워둘 수 있습니다.)
  3. 부모 데이터 삭제의 제한: 부모 테이블에서 홍길동(1001)을 삭제(탈퇴)하려 할 때, 자식 테이블에 홍길동의 주문 내역이 남아있다면 DB는 고아(Orphan) 데이터가 생기는 것을 막기 위해 탈퇴를 거부합니다. (이를 처리하기 위해 CASCADE 옵션 등을 씁니다.)

Ⅲ. 외래 키의 유연성

  • 자체 참조 (Self-Referencing): 외래 키가 반드시 남의 테이블만 참조해야 하는 것은 아닙니다. 자기 자신의 테이블에 있는 기본 키를 참조할 수도 있습니다.
    • 예시: 사원 테이블의 관리자_사번(FK) 컬럼이 같은 사원 테이블 내에 있는 부장님의 사번(PK)을 가리키는 경우. (트리/조직도 구조를 만들 때 쓰임).
  • 이름 변경: 부모 테이블에서는 사번이었는데, 자식 테이블로 가져올 때는 팀장사번으로 열 이름을 내 마음대로 바꿔서(도메인은 같게) 외래 키로 쓸 수 있습니다.

📢 섹션 요약 비유: 외래 키(FK)는 **부모님(회원 테이블)의 신용카드(기본 키)**를 자식(주문 테이블)이 들고나가서 긁는 것과 같습니다. 자식이 카드를 긁으려면 반드시 그 카드가 아빠 지갑(부모 PK)에 실존하는 정상적인 카드여야 결제가 승인됩니다. 만약 자식이 밖에서 할부로 카드를 긁고 있는데(자식 데이터 존재), 부모가 맘대로 카드를 해지(부모 PK 삭제)해버리면 은행(DB)이 결제를 막으며 경고를 울리는 것이 참조 무결성입니다.