이 글에서는 SQL Server에서 외래 키(Foreign Key)를 사용하는 방법을 문법과 실제 예제를 통해 자세히 소개합니다.
SQL Server에서 외래 키란 무엇인가?
외래 키는 SQL Server 데이터베이스에서 테이블 간의 참조 관계를 설정하기 위해 사용됩니다. 외래 키가 지정된 컬럼의 값은 반드시 다른 테이블에 존재해야 한다는 규칙을 의미합니다.
참조되는 테이블을 부모 테이블(parent table), 외래 키를 포함하는 테이블을 자식 테이블(child table)이라고 부릅니다. 일반적으로 자식 테이블의 외래 키는 부모 테이블의 기본 키(PRIMARY KEY)를 참조합니다.
외래 키는 CREATE TABLE 명령어 또는 ALTER TABLE 명령어를 통해 생성할 수 있습니다.
CREATE TABLE 명령어로 외래 키 생성하기
문법
CREATE TABLE bang_con (
cot1 kieudulieu [ NULL | NOT NULL ],
cot2 kieudulieu [ NULL | NOT NULL ],
…
CONSTRAINT fk_ten
FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);
매개변수 설명
bang_con
생성하려는 자식 테이블의 이름입니다.
cot1, cot2
테이블에 생성할 컬럼들입니다. 각 컬럼은 하나의 데이터 타입을 가지며, NULL 또는 NOT NULL 여부를 반드시 지정해야 합니다. 지정하지 않으면 기본값은 NULL로 설정됩니다.
fk_ten
생성할 외래 키 제약 조건(constraint)의 이름입니다.
cot_con1, cot_con2, … cot_con_n
자식 테이블(bang_con)에서 부모 테이블(bang_me)의 기본 키를 참조하고자 하는 컬럼들입니다.
bang_me
자식 테이블에서 참조하는 기본 키를 포함하고 있는 부모 테이블의 이름입니다.
cot_me1, cot_me2, … cot_me_n
부모 테이블(bang_me)의 기본 키를 구성하는 컬럼들입니다. 외래 키는 이 컬럼들과 자식 테이블의 cot_con1, cot_con2, … cot_con_n 컬럼 사이에 제약 조건을 형성합니다.
ON DELETE와 ON UPDATE 옵션
ON DELETE(선택 사항)
부모 테이블의 데이터가 삭제될 때 자식 테이블의 데이터를 어떻게 처리할지 지정합니다. NO ACTION, CASCADE, SET NULL, SET DEFAULT 중 선택할 수 있습니다.
ON UPDATE(선택 사항)
부모 테이블의 데이터가 수정될 때 자식 테이블의 데이터를 어떻게 처리할지 지정합니다. 마찬가지로 NO ACTION, CASCADE, SET NULL, SET DEFAULT 중 선택 가능합니다.
각 옵션의 의미는 다음과 같습니다.
- NO ACTION: 부모 데이터가 삭제되거나 수정되더라도 자식 데이터에는 아무런 작업을 수행하지 않습니다.
- CASCADE: 부모 데이터가 삭제 또는 수정되면 자식 데이터도 함께 삭제 또는 수정됩니다.
- SET NULL: 부모 데이터가 삭제 또는 수정되면 자식 데이터를 NULL로 설정합니다.
- SET DEFAULT: 부모 데이터가 삭제 또는 수정되면 자식 데이터를 기본값으로 설정합니다.
외래 키는 연쇄 삭제(Cascade Delete) 방식이나 SET NULL 방식 등 다양한 참조 동작과 함께 활용할 수 있습니다.
예제 1: 단일 컬럼 외래 키
CREATE TABLE sanpham (
id_sanpham INT PRIMARY KEY,
ten_sanpham VARCHAR(50) NOT NULL,
phan_loai VARCHAR(25)
);
CREATE TABLE hangtonkho (
id_hangtonkho INT PRIMARY KEY,
id_sanpham INT NOT NULL,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
);
위 예제에서는 먼저 id_sanpham 필드를 기본 키로 갖는 부모 테이블 sanpham(제품)을 생성했습니다. 그다음 자식 테이블인 hangtonkho(재고)를 만듭니다.
hangtonkho 테이블 생성문에서 외래 키 이름은 fk_htk_id_sanpham으로 지정되었으며, 이 외래 키는 hangtonkho 테이블의 id_sanpham 컬럼과 sanpham 테이블의 id_sanpham 컬럼 사이에 참조 관계를 형성합니다.
예제 2: 복합 컬럼 외래 키
위 예제는 하나의 컬럼으로 구성된 외래 키였습니다. 이번에는 두 개 이상의 컬럼으로 구성된 외래 키를 만들어 보겠습니다.
CREATE TABLE sanpham (
ten_sanpham VARCHAR(50) NOT NULL,
diadiem VARCHAR(50) NOT NULL,
phanloai VARCHAR(25),
CONSTRAINT sanpham_pk PRIMARY KEY (ten_sanpham, diadiem)
);
CREATE TABLE hangtonkho (
id_hangtonkho INT PRIMARY KEY,
ten_sanpham VARCHAR(50) NOT NULL,
diadiem VARCHAR(50) NOT NULL,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_sanpham
FOREIGN KEY (ten_sanpham, diadiem)
REFERENCES sanpham (ten_sanpham, diadiem)
);
이 예제에서 부모 테이블인 sanpham은 ten_sanpham과 diadiem 두 컬럼으로 구성된 복합 기본 키를 가집니다. 따라서 자식 테이블의 외래 키도 반드시 이 두 컬럼을 함께 참조해야 합니다.
ALTER TABLE 명령어로 외래 키 생성하기
이미 존재하는 테이블에 외래 키를 추가하려면 ALTER TABLE 명령어를 사용합니다.
문법
ALTER TABLE bang_con
ADD CONSTRAINT fk_ten
FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n);
매개변수 설명
bang_con
외래 키를 추가하려는 자식 테이블의 이름입니다.
fk_ten
생성할 외래 키 제약 조건의 이름입니다.
cot_con1, cot_con2, … cot_con_n
자식 테이블에서 부모 테이블의 기본 키를 참조할 컬럼들입니다.
bang_me
참조 대상이 되는 기본 키를 포함한 부모 테이블의 이름입니다.
cot_me1, cot_me2, … cot_me_n
부모 테이블의 기본 키를 구성하는 컬럼들로, 자식 테이블의 해당 컬럼들과 제약 조건을 형성합니다.
예제 1: 단일 컬럼 외래 키 추가
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham);
이 예제는 hangtonkho 테이블에 fk_htk_id_sanpham이라는 이름의 외래 키를 생성하고, id_sanpham 컬럼을 기준으로 sanpham 테이블을 참조합니다.
예제 2: 복합 컬럼 외래 키 추가
두 개 이상의 필드로 구성된 외래 키도 아래와 같이 생성할 수 있습니다.
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_sanpham
FOREIGN KEY (ten_sanpham, diadiem)
REFERENCES sanpham (ten_sanpham, diadiem);
위 예제는 hangtonkho 테이블에 fk_htk_sanpham이라는 외래 키를 생성하여, ten_sanpham과 diadiem 두 컬럼을 기준으로 sanpham 테이블을 참조하도록 설정합니다.
마무리
외래 키는 데이터베이스의 참조 무결성(referential integrity)을 유지하는 핵심 도구입니다. 테이블 생성 시점에는 CREATE TABLE, 기존 테이블에는 ALTER TABLE을 사용해 외래 키를 정의할 수 있으며, ON DELETE와 ON UPDATE 옵션을 적절히 활용하면 부모 데이터 변경 시 자식 데이터의 처리 방식을 세밀하게 제어할 수 있습니다.