2 분 소요

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. 외래 키 제약 조건 이름이 없으면 삭제할 수 없나요?

  • 그렇습니다. 반드시 외래 키 생성 시 제약 조건 이름을 지정하는 것이 관리에 유리합니다.

카테고리:

업데이트:

댓글남기기