SQL Foreign Key
SQL FOREIGN KEY: 외래 키
SQL FOREIGN KEY는 한 테이블의 열이 다른 테이블의 PRIMARY KEY 또는 UNIQUE 키를 참조하는 제약 조건입니다. FOREIGN KEY는 두 테이블 간의 관계를 설정하며, 이를 통해 데이터베이스에서 참조 무결성을 보장할 수 있습니다. 외래 키는 두 테이블 사이에 관계를 정의하고, 참조된 테이블의 값만을 허용하여 데이터의 무결성을 유지합니다.
1. FOREIGN KEY의 특징
- 참조 무결성: 외래 키는 참조된 테이블의 기본 키 또는 고유한 값만을 허용하여 데이터의 일관성을 보장합니다.
- 다중 테이블 간 관계: 외래 키는 두 테이블 간의 1:1, 1:N 또는 N:M 관계를 설정할 수 있습니다.
- 제약 조건으로 참조된 값만 삽입: 외래 키 제약 조건을 설정하면 참조된 테이블에 없는 값은 삽입할 수 없습니다.
- 참조 작업: 외래 키는 CASCADE, SET NULL, NO ACTION 등의 옵션을 사용하여 참조된 값의 변경 또는 삭제 시 동작을 제어할 수 있습니다.
2. FOREIGN KEY 기본 문법
2.1 테이블 생성 시 FOREIGN KEY 설정
CREATE TABLE 테이블_이름 (
열_이름 데이터_타입,
FOREIGN KEY (열_이름) REFERENCES 참조_테이블(참조_열_이름)
);
- 열_이름: 외래 키로 사용할 열의 이름.
- 참조_테이블: 외래 키가 참조할 다른 테이블의 이름.
- 참조_열_이름: 참조 테이블에서 기본 키 또는 UNIQUE 키로 설정된 열.
2.2 테이블 생성 후 FOREIGN KEY 추가 (ALTER TABLE)
ALTER TABLE 테이블_이름
ADD CONSTRAINT 제약조건_이름 FOREIGN KEY (열_이름) REFERENCES 참조_테이블(참조_열_이름);
3. FOREIGN KEY 예제
3.1 테이블 생성 시 외래 키 설정
예제: employees
테이블의 department_id
가 departments
테이블의
department_id
를 참조
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100)
);
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
이 명령은 employees 테이블의 department_id 열이 departments 테이블의 department_id를 참조하도록 설정합니다. 이는 두 테이블 간의 부서와 직원 관계를 정의합니다. 즉, employees 테이블의 department_id 값은 departments 테이블에 존재하는 값이어야만 합니다.
3.2 테이블 생성 후 외래 키 추가 (ALTER TABLE)
예제: employees
테이블에 외래 키 추가
ALTER TABLE employees
ADD CONSTRAINT fk_department_id FOREIGN KEY (department_id) REFERENCES departments(department_id);
이 명령은 employees 테이블에 fk_department_id라는 외래 키 제약 조건을 추가하여, department_id 열이 departments 테이블의 department_id를 참조하도록 합니다.
4. 외래 키 동작 옵션
외래 키 제약 조건을 설정할 때, 참조된 테이블의 행이 수정 또는 삭제될 경우 어떻게 처리할지를 정의할 수 있습니다.
- ON DELETE CASCADE: 참조된 테이블에서 행이 삭제되면, 외래 키로 연결된 테이블의 행도 자동으로 삭제됩니다.
- ON UPDATE CASCADE: 참조된 테이블의 값이 변경되면, 외래 키로 연결된 테이블의 값도 자동으로 변경됩니다.
- ON DELETE SET NULL: 참조된 테이블의 행이 삭제되면, 외래 키로 연결된 테이블의 열이 NULL로 설정됩니다.
- ON DELETE RESTRICT: 참조된 테이블의 행이 삭제되면, 외래 키로 연결된 테이블에서 삭제할 수 없습니다.
- ON DELETE NO ACTION: 기본 동작으로, 아무런 특별한 동작 없이 기본적으로 참조된 값이 삭제되지 않도록 방지합니다.
문법
CREATE TABLE 테이블_이름 (
열_이름 데이터_타입,
FOREIGN KEY (열_이름) REFERENCES 참조_테이블(참조_열_이름)
ON DELETE CASCADE
ON UPDATE CASCADE
);
예제: employees
테이블에서 외래 키 삭제 시 자동으로 관련 행 삭제
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
이 예제는 departments 테이블의 행이 삭제되거나 수정될 경우, employees 테이블의 관련된 행도 자동으로 삭제 또는 업데이트되도록 설정합니다.
5. FOREIGN KEY 제거
기존 테이블에서 FOREIGN KEY 제약 조건을 제거할 수 있습니다.
문법
ALTER TABLE 테이블_이름
DROP FOREIGN KEY 제약조건_이름;
예제: employees
테이블에서 외래 키 제거
ALTER TABLE employees
DROP FOREIGN KEY fk_department_id;
이 명령은 employees 테이블에서 fk_department_id라는 외래 키 제약 조건을 제거합니다.
6. FOREIGN KEY와 JOIN
FOREIGN KEY는 두 테이블 간의 관계를 정의하므로, 이를 이용해 JOIN 쿼리를 수행할 수 있습니다. 예를 들어, employees 테이블과 departments 테이블을 외래 키로 연결한 상태에서 JOIN을 사용할 수 있습니다.
예제: employees
와 departments
테이블을 JOIN하여 데이터 조회
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
이 쿼리는 employees 테이블과 departments 테이블을 department_id를 기준으로 JOIN하여 직원의 이름과 부서 이름을 조회합니다.
7. 실전 예제
예제 1: employees
테이블과 departments
테이블 간의 외래 키 설정
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100)
);
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
이 예제는 departments와 employees 테이블을 department_id를 통해 연결하고, CASCADE 옵션을 설정하여 참조된 값이 변경되면 자동으로 변경 또는 삭제되도록 합니다.
예제 2: 외래 키 제거
ALTER TABLE employees
DROP FOREIGN KEY fk_department_id;
이 명령은 employees 테이블에서 외래 키를 제거합니다.
8. 요약
- FOREIGN KEY는 두 테이블 간의 참조 무결성을 보장하며, 한 테이블의 열이 다른 테이블의 기본 키나 고유 키를 참조하도록 설정합니다.
- 테이블을 생성할 때 또는 ALTER TABLE을 통해 외래 키를 추가할 수 있습니다.
- 외래 키는 참조된 테이블의 값이 삭제되거나 변경될 때 ON DELETE CASCADE, ON UPDATE CASCADE와 같은 동작을 설정할 수 있습니다.
- 외래 키 제약 조건을 설정하면 참조된 테이블의 값을 강제로 맞춰야 하므로, 데이터의 일관성과 무결성을 유지할 수 있습니다.
FOREIGN KEY는 데이터베이스에서 테이블 간의 관계를 정의하고, 데이터의 무결성을 보장하는 중요한 도구입니다. 이를 통해 여러 테이블의 데이터를 연계하여 효율적으로 관리할 수 있습니다.