외래 키(FK)로 관계형 데이터베이스의 참조 무결성 설계하기
외래 키(FK)의 참조 무결성 규칙과 CASCADE, SET NULL, RESTRICT 옵션을 데이터 모델링과 성능 관점에서 정리한다.
2026-08-14 · 최초 발행 2025-08-10
테이블 관계를 데이터베이스에 선언하는 방법
외래 키(Foreign Key)는 한 테이블의 필드가 다른 테이블의 기본 키(Primary Key)를 참조하도록 만들어 관계형 데이터베이스의 논리적 연결과 데이터 무결성을 유지하는 제약조건이다.
외래 키가 참조할 수 있는 대상은 기본 키(PK) 또는 UNIQUE 제약조건이 설정된 열이다. 외래 키를 가진 테이블과 참조 대상 테이블은 종속 관계를 이루며, 외래 키에는 NULL 또는 참조 테이블에 실제로 존재하는 키 값만 저장할 수 있다.
릴레이션 R1이 릴레이션 R2의 특정 속성을 반드시 참조해야 한다면, R1과 R2 사이에는 외래 키 관계가 형성된다. 이때 R2의 참조 대상 속성은 PK이거나 UNIQUE 제약조건을 가져야 한다.
참조 무결성 검사와 인덱스
참조 무결성이 적용된 테이블에서 인덱스가 없으면 성능 문제가 생길 수 있다. DBMS가 참조 무결성을 검사하는 과정에서 참조되는 테이블 전체를 스캔할 수도 있기 때문이다. 외래 키로 지정한 열에는 인덱스 생성을 검토할 필요가 있다.
입력·수정·삭제에서 달라지는 참조 규칙
새 데이터를 입력할 때는 참조 테이블에 해당 값이 존재하는지 검사한다. 존재하지 않는 값을 입력하려 하면 오류가 발생한다.
참조 대상 테이블의 키 값을 수정하거나 레코드를 삭제할 때는 다음 옵션으로 처리 규칙을 정할 수 있다.
CASCADE: 참조 대상 값이 수정되면 참조하는 테이블의 값도 함께 변경된다. 참조 대상 레코드가 삭제되면 관련 레코드도 함께 삭제된다.SET NULL: 참조 대상 값이 수정되거나 레코드가 삭제되면 참조하는 테이블의 외래 키 값을 NULL로 설정한다.SET DEFAULT: 참조 대상 값이 수정되거나 레코드가 삭제되면 참조하는 테이블의 외래 키 값을 기본값으로 설정한다.RESTRICT: 참조하는 테이블에서 사용 중인 값은 변경하거나 해당 레코드를 삭제할 수 없다.
SQL로 외래 키 선언하기
아래 예시는 dept 테이블의 empno, name이 emp 테이블의 같은 열을 참조하도록 선언하고, 참조 대상 삭제 시 관련 dept 레코드도 삭제하도록 지정한다.
CREATE TABLE dept (
deptcode VARCHAR(10),
deptname VARCHAR(50),
empno INT,
name VARCHAR(50),
CONSTRAINT dep_pk PRIMARY KEY(deptcode),
CONSTRAINT d_fk FOREIGN KEY(empno, name) REFERENCES emp(empno, name)
ON DELETE CASCADE
);
삭제 동작을 데이터 관계에 맞추기
옵션을 지정하지 않은 외래 키는 RESTRICT와 유사하게 동작한다. 참조되는 레코드를 삭제하려 하면 참조 무결성 오류가 발생하며, 가장 안전한 방식이다.
CREATE TABLE dept (
deptcode VARCHAR(10),
empno INT,
CONSTRAINT dep_pk PRIMARY KEY(deptcode),
CONSTRAINT d_fk FOREIGN KEY(empno) REFERENCES emp(empno)
);
ON DELETE CASCADE는 emp 테이블에서 레코드를 삭제할 때 해당 empno를 참조하는 dept 테이블의 레코드까지 함께 삭제한다. 종속 데이터를 모두 제거해야 할 때 유용하지만, 의도하지 않은 데이터 손실 가능성도 있다.
CREATE TABLE dept (
deptcode VARCHAR(10),
empno INT,
CONSTRAINT dep_pk PRIMARY KEY(deptcode),
CONSTRAINT d_fk FOREIGN KEY(empno) REFERENCES emp(empno)
ON DELETE CASCADE
);
ON DELETE SET NULL은 참조 대상 레코드가 삭제되어도 dept 테이블의 레코드를 유지한다. 대신 해당 empno 값은 NULL로 바뀌어 참조 관계가 끊어진다.
CREATE TABLE dept (
deptcode VARCHAR(10),
empno INT,
CONSTRAINT dep_pk PRIMARY KEY(deptcode),
CONSTRAINT d_fk FOREIGN KEY(empno) REFERENCES emp(empno)
ON DELETE SET NULL
);
모델에 드러나는 관계와 선택 기준
외래 키는 테이블 간 관계를 명확히 표현하며, 1:N과 N:M 관계를 구현하는 핵심 요소다. ERD(Entity Relationship Diagram)에서도 관계 표현의 기본이 된다.
참조 무결성 옵션은 관계의 성격에 따라 선택한다.
- 부모-자식 관계가 강한 경우에는
CASCADE를 사용한다. 예를 들어 주문과 주문상세 관계가 있다. - 관계는 있지만 각각 독립적으로 존재할 수 있다면
SET NULL을 고려한다. - 데이터 보호가 중요한 경우에는
RESTRICT가 적합하다.
외래 키는 설계의 명확성과 데이터 일관성을 높이고, 도메인 무결성을 강화하며 오류 데이터 입력을 막는다. 반면 참조 무결성 검사에 따른 성능 오버헤드가 발생할 수 있고, 삽입·수정·삭제 작업은 더 복잡해진다. 대용량 데이터를 다룰 때도 이 영향을 함께 고려해야 한다.