개념/배경
결론부터 말하면 가능함 Foreign Key 컬럼의 NULL 허용 여부는 해당 컬럼의 NULL 혹은 NOT NULL 제약으로 결정됨 FK 제약은 NULL이 아닌 값만 검증하므로 값이 NULL인 경우 참조 무결성 검사를 생략함
- 컬럼이 NOT NULL이면 NULL 저장 불가
- 컬럼이 NULL 허용이면 NULL 저장 가능
핵심 개념
- FK 제약은 입력값이 존재할 때만 참조 대상 테이블에 키가 있는지 검사
- NULL은 미지정 상태로 간주되어 검증 대상 아님
- 대부분의 RDBMS에서 기본은 NULL 허용 컬럼이며, 명시적으로 NOT NULL을 지정해야 함
동작 원리
- INSERT 또는 UPDATE 시 FK 컬럼이 NULL이면 무결성 검사 스킵
- 값이 존재하면 참조 테이블의 대상 키 존재 여부 검사
- 복합 FK의 경우 참조 컬럼 중 하나라도 NULL이면 전체 FK 검사를 생략하는 동작이 일반적임
간단 예시
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
);- child.parent_id는 기본적으로 NULL 허용 상태
- parent_id에 NULL을 넣어도 FK 위반 아님
- parent_id에 NOT NULL을 추가하면 parent에 존재하는 id만 허용됨
주의 사항
- ON DELETE SET NULL을 사용할 경우 FK 컬럼이 NULL 허용이어야 함
- FK 컬럼 인덱스는 필수는 아니나 삭제·업데이트 시 성능과 잠금 범위 측면에서 권장
- 관계가 필수라면 애플리케이션 규칙이 아닌 스키마에서 NOT NULL로 모델링하는 편이 안전함
마무리
FK 컬럼은 NULL 허용 설정이면 NULL을 저장할 수 있으며, 이 경우 FK 검사는 수행되지 않음 NULL을 금지하고 참조 무결성을 강제하려면 NOT NULL을 함께 적용하면 됨