IT이야기/데이터베이스

외래 키(Foreign Key): 관계형 데이터베이스에서 데이터 무결성을 유지하는 핵심 키

Chiba-in 2025. 2. 28. 08:00

🔹 외래 키(Foreign Key)란?

1. 외래 키의 정의

외래 키(Foreign Key, FK)는 한 테이블의 열(Column)이 다른 테이블의 기본 키(Primary Key)를 참조하도록 설정된 키입니다.
이를 통해 테이블 간 관계(Relationship)를 정의하고 데이터 무결성(Referential Integrity)을 유지할 수 있습니다.

외래 키의 주요 역할:

  • 테이블 간 논리적 관계를 설정하여 데이터 일관성 유지
  • 데이터 삭제 및 변경 시 참조 무결성(Referential Integrity) 보장
  • 데이터 중복을 방지하고 효율적인 데이터 저장 및 검색 지원

📌 외래 키는 관계형 데이터베이스(RDBMS)에서 가장 중요한 개념 중 하나로, 다대일(1:N), 다대다(N:M) 관계를 정의하는 데 필수적으로 사용됨


🔹 외래 키의 주요 특징

1. 기본 키(Primary Key)와 연결

  • 외래 키는 반드시 다른 테이블의 기본 키(Primary Key)를 참조해야 함
  • 기본 키 값이 변경되거나 삭제될 때, 외래 키 제약 조건에 따라 동작이 결정됨

✔️ 기본 키와 외래 키 관계 예제:

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Name VARCHAR(100),
    Email VARCHAR(100) UNIQUE
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

📌 Orders 테이블의 CustomerID는 Customers 테이블의 CustomerID를 참조하는 외래 키로 설정됨


2. 데이터 무결성(Referential Integrity) 유지

  • 외래 키는 부모 테이블(Primary Key 테이블)의 데이터를 참조해야 하므로, 존재하지 않는 값을 가질 수 없음
  • 부모 테이블의 기본 키가 삭제되거나 변경될 때, 외래 키 설정에 따라 자동으로 처리됨

✔️ 잘못된 데이터 삽입 (오류 발생!)

INSERT INTO Orders (OrderID, CustomerID, OrderDate)  
VALUES (101, 999, '2024-02-20');  -- Customers 테이블에 CustomerID 999가 없음 ❌ 오류 발생!

📌 외래 키 제약 조건으로 인해 존재하지 않는 CustomerID를 참조할 수 없음


3. ON DELETE 및 ON UPDATE 옵션 지원

  • 부모 테이블(참조 테이블)의 기본 키가 삭제되거나 변경될 때, 외래 키 테이블에서 수행할 동작을 정의할 수 있음
옵션 설명
CASCADE 부모 테이블의 값이 변경/삭제되면 외래 키도 함께 변경/삭제됨
SET NULL 부모 테이블의 값이 삭제되면 외래 키 값을 NULL로 설정
SET DEFAULT 부모 테이블의 값이 삭제되면 기본값으로 변경
RESTRICT 부모 테이블의 값을 삭제할 수 없음 (기본 설정)
NO ACTION 기본 설정과 동일하게 부모 테이블이 삭제되면 오류 발생

✔️ ON DELETE CASCADE 예제:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE
);

📌 부모 테이블(Customers)의 CustomerID가 삭제되면, Orders 테이블의 해당 CustomerID 값도 자동으로 삭제됨

✔️ ON DELETE SET NULL 예제:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE SET NULL
);

📌 부모 테이블(Customers)의 CustomerID가 삭제되면, Orders 테이블의 CustomerID 값이 NULL로 설정됨


🔹 외래 키 설정 방법

1. 테이블 생성 시 FOREIGN KEY 설정

✔️ 기본 외래 키 설정 예제:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

✔️ 외래 키에 제약 조건 추가:

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT NOT NULL,
    OrderDate DATE,
    CONSTRAINT fk_customer FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

2. 기존 테이블에 외래 키 추가(ALTER TABLE)

✔️ 기존 테이블에 외래 키 추가:

ALTER TABLE Orders ADD CONSTRAINT fk_customer FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);

✔️ 외래 키 삭제:

ALTER TABLE Orders DROP FOREIGN KEY fk_customer;

🔹 외래 키를 활용한 실무 사례

1. 전자상거래 시스템에서 고객과 주문 관계 정의

📌 활용:

  • 고객(Customer)과 주문(Order) 간의 관계를 설정하여, 고객 정보 삭제 시 관련 주문 데이터를 자동 삭제

✔️ SQL 코드:

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(100),
    Email VARCHAR(100) UNIQUE
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY AUTO_INCREMENT,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ON DELETE CASCADE
);

📌 고객 정보가 삭제되면 해당 고객의 주문 데이터도 자동으로 삭제됨


2. 인사관리 시스템에서 직원과 부서 관계 설정

📌 활용:

  • 직원(Employee)과 부서(Department) 간의 관계를 설정하여, 부서 삭제 시 직원 정보 업데이트 처리

✔️ SQL 코드:

CREATE TABLE Departments (
    DeptID INT PRIMARY KEY,
    DeptName VARCHAR(100)
);

CREATE TABLE Employees (
    EmpID INT PRIMARY KEY,
    Name VARCHAR(100),
    DeptID INT,
    FOREIGN KEY (DeptID) REFERENCES Departments(DeptID) ON DELETE SET NULL
);

📌 부서가 삭제되면 해당 부서에 속한 직원의 DeptID 값이 NULL로 변경됨


📌 결론

외래 키(Foreign Key)는 관계형 데이터베이스에서 테이블 간의 관계를 정의하는 중요한 개념이다.
외래 키는 다른 테이블의 기본 키(Primary Key)를 참조하여 데이터의 일관성과 무결성을 유지한다.
ON DELETE 및 ON UPDATE 옵션을 사용하면 부모 테이블의 데이터 변경 또는 삭제 시 외래 키의 동작을 제어할 수 있다.
전자상거래, 인사관리, 금융 시스템 등 다양한 데이터 중심 애플리케이션에서 외래 키는 필수적인 데이터 무결성 관리 도구로 사용된다.