MySQL에서 외래 키(Foreign Key) 설정 방법

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 DELETEON 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. 외래 키 설정 시 고려 사항

  • 인덱스: 외래 키는 기본적으로 자식 테이블의 컬럼에 인덱스를 생성하여 성능을 향상시킵니다.
  • 참조 무결성: 외래 키를 설정하면 부모 테이블에 없는 값을 자식 테이블에 삽입할 수 없으므로, 데이터 무결성을 보장합니다.
  • 삭제 및 수정 동작: 부모 데이터가 삭제되거나 수정될 때 자식 데이터에 어떤 영향을 미칠지를 명확히 정의해야 합니다.
  • 외래 키 성능: 외래 키 제약 조건이 성능에 영향을 미칠 수 있으므로, 자주 변경되는 테이블에 대해서는 신중하게 적용해야 합니다.

외래 키를 활용하면 데이터베이스의 관계를 정의하고, 데이터 무결성을 보장하여 데이터의 일관성과 신뢰성을 유지할 수 있습니다.