MySQL에서 외래 키(Foreign Key)는 두 테이블 간의 관계를 정의하고 데이터 무결성을 보장하는 중요한 제약 조건입니다. 외래 키를 사용하면, 한 테이블의 데이터가 다른 테이블의 데이터와 일관되게 유지되도록 할 수 있습니다.
1. 외래 키(Foreign Key)란?
외래 키(Foreign Key)는 하나의 테이블에서 다른 테이블의 기본 키를 참조하는 컬럼을 의미합니다. 외래 키는 두 테이블 간의 관계를 정의하며, 한 테이블의 데이터가 다른 테이블의 데이터에 의존하도록 만듭니다. 외래 키 제약 조건은 참조 무결성(Referential Integrity)을 보장하여, 부모 테이블에 없는 값이 자식 테이블에 삽입되지 않도록 합니다.
외래 키의 주요 기능
- 두 테이블 간의 관계 정의
- 자식 테이블의 데이터가 부모 테이블에 존재하는 값만 참조하도록 제한
- 데이터 무결성 유지
- 데이터 삭제 및 갱신 시 자동으로 자식 테이블의 데이터를 업데이트하거나 삭제
2. 외래 키 설정하기
MySQL에서 외래 키를 설정하려면 `CREATE TABLE` 또는 `ALTER TABLE` 구문을 사용하여 테이블을 생성하거나 기존 테이블에 외래 키를 추가할 수 있습니다. 외래 키를 설정하려면 부모 테이블(참조 대상 테이블)의 기본 키를 자식 테이블(참조하는 테이블)에서 참조해야 합니다.
2.1. 외래 키 설정 기본 문법
CREATE TABLE child_table (
child_id INT,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent_table(parent_id)
);
위 예시에서 `child_table` 테이블의 `parent_id` 컬럼은 `parent_table` 테이블의 `parent_id` 컬럼을 참조하는 외래 키로 설정됩니다.
2.2. 외래 키 설정 예시
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
위 예시는 `users` 테이블과 `orders` 테이블을 생성하고, `orders` 테이블의 `user_id` 컬럼을 `users` 테이블의 `user_id` 컬럼을 참조하는 외래 키로 설정하는 예시입니다. 이를 통해 `orders` 테이블의 `user_id`는 반드시 `users` 테이블에 존재하는 값만 참조할 수 있습니다.
3. 외래 키의 제약 조건
외래 키는 데이터의 무결성을 보장하기 위해 몇 가지 제약 조건을 적용합니다. 외래 키를 설정할 때, 참조 무결성을 유지하는 방법에 따라 여러 동작을 정의할 수 있습니다.
3.1. 외래 키 동작 설정
외래 키는 부모 테이블의 데이터가 변경될 때 자식 테이블에 어떻게 영향을 미칠지를 정의하는 규칙을 설정할 수 있습니다. 이를 ON DELETE 및 ON UPDATE 옵션을 통해 설정합니다.
- ON DELETE CASCADE: 부모 테이블에서 데이터가 삭제되면 자식 테이블의 관련 데이터도 자동으로 삭제됩니다.
- ON DELETE SET NULL: 부모 테이블에서 데이터가 삭제되면 자식 테이블의 관련 데이터는 `NULL`로 설정됩니다.
- ON UPDATE CASCADE: 부모 테이블에서 데이터가 수정되면 자식 테이블의 관련 데이터도 자동으로 수정됩니다.
- ON UPDATE SET NULL: 부모 테이블에서 데이터가 수정되면 자식 테이블의 관련 데이터는 `NULL`로 설정됩니다.
3.2. 외래 키 제약 조건 예시
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
위 예시는 `orders` 테이블에서 `user_id` 외래 키에 대해 부모 테이블 `users`의 데이터가 삭제되거나 수정될 때 자식 테이블의 데이터도 자동으로 처리되도록 설정한 예시입니다. `ON DELETE CASCADE`는 부모 데이터가 삭제될 때 자식 데이터를 삭제하고, `ON UPDATE CASCADE`는 부모 데이터가 수정되면 자식 데이터도 함께 수정됩니다.
4. 외래 키 활용 예시
외래 키는 여러 테이블 간의 관계를 정의하고, 데이터 무결성을 유지하는 데 중요한 역할을 합니다. 아래는 외래 키를 활용한 몇 가지 예시입니다.
4.1. 데이터 삽입 예시
외래 키를 설정한 테이블에 데이터를 삽입할 때는 부모 테이블에 존재하는 값만 자식 테이블에 삽입할 수 있습니다.
INSERT INTO users (user_id, username) VALUES (1, 'John Doe');
INSERT INTO orders (order_id, user_id, order_date) VALUES (1, 1, '2022-06-15');
위 예시에서, `orders` 테이블에 데이터를 삽입할 때 `user_id`는 `users` 테이블에 존재하는 값이어야 합니다. 외래 키 제약 조건이 이를 강제합니다.
4.2. 데이터 삭제 예시
부모 테이블의 데이터를 삭제할 때 자식 테이블의 관련 데이터가 어떻게 처리될지 외래 키에서 설정한 동작에 따라 달라집니다.
DELETE FROM users WHERE user_id = 1;
만약 `ON DELETE CASCADE`가 설정되어 있다면, `user_id`가 1인 사용자가 삭제될 때 해당 사용자의 주문 데이터도 자동으로 삭제됩니다.
5. 외래 키 설정 시 고려 사항
- 인덱스: 외래 키는 기본적으로 자식 테이블의 컬럼에 인덱스를 생성하여 성능을 향상시킵니다.
- 참조 무결성: 외래 키를 설정하면 부모 테이블에 없는 값을 자식 테이블에 삽입할 수 없으므로, 데이터 무결성을 보장합니다.
- 삭제 및 수정 동작: 부모 데이터가 삭제되거나 수정될 때 자식 데이터에 어떤 영향을 미칠지를 명확히 정의해야 합니다.
- 외래 키 성능: 외래 키 제약 조건이 성능에 영향을 미칠 수 있으므로, 자주 변경되는 테이블에 대해서는 신중하게 적용해야 합니다.
'개발 > DB' 카테고리의 다른 글
MySQL에서 데이터 복제(Replication) 설정하기 (2) | 2025.08.06 |
---|---|
MySQL 데이터베이스 백업과 복원 방법 (2) | 2025.08.05 |
MySQL에서 뷰(View) 생성과 활용법 (2) | 2025.08.03 |
MySQL에서 트리거(Trigger) 사용법 (2) | 2025.08.02 |
MySQL에서 저장 프로시저와 함수 활용법 (3) | 2025.08.01 |