SQL FOREIGN KEY 제약 조건 관계 설정부터 삭제
FOREIGN KEY는 SQL에서 테이블 간의 관계를 정의하는 제약 조건입니다. 데이터의 참조 무결성(존재하지 않는 데이터를 참조하지 않도록 보장)을 유지하는 데 핵심적인 역할을 하며, 데이터 삭제나 수정 시 동작을 자동화할 수 있는 강력한 옵션도 제공합니다.
1. FOREIGN KEY란?
| 특징 | 설명 |
|---|---|
| 테이블 간 관계 설정 | 다른 테이블의 값을 참조하는 필드 지정 |
| 참조 무결성 유지 | 참조 대상에 없는 값은 삽입 불가 |
| 기준 필드 제약 조건 | 참조 대상 필드는 반드시 PRIMARY KEY 또는 UNIQUE |
| 동작 지정 가능 | ON DELETE, ON UPDATE 옵션으로 변경/삭제 시 동작 지정 가능 |
2. FOREIGN KEY 설정 방법
2.1. CREATE TABLE에서 설정
✅ 기본 외래 키 설정
CREATE TABLE Orders (
OrderID INT,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(ID)
);
✅ 제약 조건 이름 지정
CREATE TABLE Orders (
OrderID INT,
CustomerID INT,
CONSTRAINT FK_Customer FOREIGN KEY (CustomerID) REFERENCES Customers(ID)
);
✅ ON DELETE / ON UPDATE 옵션 포함
CREATE TABLE Orders (
OrderID INT,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(ID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
2.2. ALTER TABLE에서 설정
✅ 새 필드와 외래 키 동시에 추가
ALTER TABLE Orders
ADD CustomerID INT,
ADD CONSTRAINT FK_Customer FOREIGN KEY (CustomerID) REFERENCES Customers(ID);
✅ 기존 필드에 외래 키 추가
ALTER TABLE Orders
ADD CONSTRAINT FK_Customer FOREIGN KEY (CustomerID) REFERENCES Customers(ID);
3. FOREIGN KEY 삭제 방법
ALTER TABLE Orders
DROP FOREIGN KEY FK_Customer;
⚠ DROP FOREIGN KEY는 제약 조건 이름이 반드시 필요합니다.
4. ON DELETE / ON UPDATE 옵션 정리
| 옵션 | 설명 |
|---|---|
CASCADE |
참조 대상이 삭제/수정되면 참조하는 데이터도 함께 삭제/수정 |
SET NULL |
참조 대상이 삭제/수정되면 참조하는 필드는 NULL로 설정 |
NO ACTION |
아무 작업도 하지 않음 (기본값, 오류 발생 가능) |
RESTRICT |
참조 중이면 삭제/수정 불가 (NO ACTION과 유사) |
SET DEFAULT |
참조 필드를 기본값으로 설정 (MySQL에서 사용 드묾) |
✅ 예제
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(ID)
ON DELETE CASCADE
ON UPDATE RESTRICT
);
- 고객이 삭제되면 해당 주문도 함께 삭제됨
- 고객 ID 수정은 불가능함
5. 실전 예제
5.1. 고객과 예약 관계
CREATE TABLE Customer (
ID INT PRIMARY KEY,
Name VARCHAR(50)
);
CREATE TABLE Reservation (
ID INT PRIMARY KEY,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customer(ID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
✅ 고객 삭제 시 해당 고객의 예약도 함께 삭제됨
5.2. 제품과 주문 관계
CREATE TABLE Product (
ProductID INT PRIMARY KEY,
Name VARCHAR(100)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
ProductID INT,
FOREIGN KEY (ProductID) REFERENCES Product(ProductID)
ON DELETE SET NULL
ON UPDATE RESTRICT
);
✅ 제품 삭제 시 주문 내 ProductID는 NULL
❌ 제품 ID 수정은 제한
6. FOREIGN KEY vs PRIMARY KEY
| 항목 | FOREIGN KEY | PRIMARY KEY |
|---|---|---|
| 역할 | 참조 무결성 유지 | 고유 식별자 역할 |
| NULL 허용 | 기본적으로 허용 | 허용하지 않음 |
| 중복 허용 | 가능 | 불가 |
| 설정 개수 | 여러 개 가능 | 하나만 가능 |
7. 요약
- FOREIGN KEY는 테이블 간 관계를 정의하고, 데이터의 참조 무결성을 보장합니다.
- 참조 필드는 반드시 PRIMARY KEY 또는 UNIQUE여야 합니다.
- ON DELETE, ON UPDATE 옵션으로 참조 대상의 삭제·수정 시 동작을 세부 설정할 수 있습니다.
- 외래 키는 테이블 생성 시 또는 ALTER TABLE 명령으로 추가 가능하며,
DROP FOREIGN KEY로 제거할 수 있습니다.
질문 정리
1. FOREIGN KEY는 어떤 필드에 설정할 수 있나요?
- 참조하려는 필드는 반드시 PRIMARY KEY 또는 UNIQUE 제약 조건이 있어야 합니다.
2. 하나의 테이블에 여러 FOREIGN KEY를 설정할 수 있나요?
- 네, 복수의 외래 키 설정이 가능합니다.
3. 외래 키 없이도 데이터베이스는 작동하나요?
- 작동은 하지만 참조 무결성 보장이 어려워져 데이터 오류 발생 가능성 증가.
4. ON DELETE CASCADE가 위험한 이유는?
- 참조 대상 삭제 시 관련 데이터도 자동 삭제되므로, 실수로 전체 데이터가 삭제될 수 있음.
5. 외래 키 제약 조건 이름이 없으면 삭제할 수 없나요?
- 그렇습니다. 반드시 외래 키 생성 시 제약 조건 이름을 지정하는 것이 관리에 유리합니다.
댓글남기기