외래 키(Foreign Key): 관계형 데이터베이스에서 데이터 무결성을 유지하는 핵심 키
🔹 외래 키(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 옵션을 사용하면 부모 테이블의 데이터 변경 또는 삭제 시 외래 키의 동작을 제어할 수 있다.
✅ 전자상거래, 인사관리, 금융 시스템 등 다양한 데이터 중심 애플리케이션에서 외래 키는 필수적인 데이터 무결성 관리 도구로 사용된다.