MySQL Foreign Key
MySQL FOREIGN KEY: 데이터베이스 간의 관계 설정하기
FOREIGN KEY는 MySQL에서 두 테이블 간의 관계를 정의하는 데 사용되는 제약 조건입니다. 외래 키는 한 테이블의 열이 다른 테이블의 기본 키를 참조하여, 데이터의 무결성을 유지하고 관계형 데이터베이스 구조를 강화합니다. 이 가이드는 MySQL에서 FOREIGN KEY를 사용하는 방법, 기본 문법, 예제 및 주의사항을 설명합니다.
1. 기본 개념
1.1. 정의
FOREIGN KEY는 한 테이블의 열이 다른 테이블의 기본 키를 참조하는 관계를 설정합니다. 이를 통해 두 테이블 간의 데이터 연결을 표현할 수 있으며, 외래 키가 설정된 열에는 항상 참조된 테이블에 존재하는 값만 입력될 수 있습니다.
1.2. 기본 문법
FOREIGN KEY는 테이블을 생성할 때 또는 ALTER TABLE 문을 사용하여 추가할 수 있습니다.
1.2.1. 테이블 생성 시 FOREIGN KEY 설정
CREATE TABLE child_table (
child_id INT,
parent_id INT,
...
FOREIGN KEY (parent_id) REFERENCES parent_table(parent_id)
);
1.2.2. 기존 테이블에 FOREIGN KEY 추가
ALTER TABLE child_table
ADD CONSTRAINT fk_name FOREIGN KEY (parent_id) REFERENCES parent_table(parent_id);
2. FOREIGN KEY 사용 예제
2.1. 테이블 생성 시 FOREIGN KEY 설정
예를 들어, users
테이블과 orders
테이블 간의 관계를 설정해보겠습니다.
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
위의 쿼리는 users
테이블을 생성하고, 각 사용자의 주문을 기록하는 orders
테이블을 생성합니다. orders
테이블의
user_id
열은 users
테이블의 user_id
를 참조하는 외래 키입니다.
2.2. 기존 테이블에 FOREIGN KEY 추가
기존 테이블에 외래 키 제약 조건을 추가하려면 다음과 같은 쿼리를 사용할 수 있습니다.
ALTER TABLE orders
ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(user_id);
이 쿼리는 orders
테이블의 user_id
열에 대해 users
테이블의 user_id
를 참조하는 외래 키를
추가합니다.
3. FOREIGN KEY의 유용성
- 데이터 무결성 보장: FOREIGN KEY는 참조 무결성을 유지하여, 데이터베이스의 무결성을 보장합니다. 예를 들어, 존재하지 않는
user_id
를 가진 주문을 입력할 수 없습니다. - 데이터 관계 표현: 외래 키를 통해 두 테이블 간의 관계를 명확히 할 수 있으며, 데이터 모델을 더 쉽게 이해할 수 있습니다.
- Cascade 옵션: 외래 키 제약 조건은 부모 테이블에서의 데이터 변경 시 자식 테이블에 영향을 미치도록 설정할 수 있습니다. 이를 통해 데이터 삭제나 업데이트 시 관련
데이터를 자동으로 처리할 수 있습니다.
- ON DELETE CASCADE: 부모 레코드가 삭제될 때, 관련된 자식 레코드도 자동으로 삭제됩니다.
- ON UPDATE CASCADE: 부모 레코드의 기본 키가 변경될 때, 관련된 자식 레코드의 외래 키도 자동으로 변경됩니다.
예제
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
이 쿼리는 user_id
를 참조하는 외래 키를 추가하며, 사용자가 삭제되면 해당 사용자의 주문도 함께 삭제되도록 설정합니다.
4. FOREIGN KEY 사용 시 주의사항
- 참조 무결성: 외래 키는 참조하는 기본 키가 반드시 존재해야 하며, 외래 키가 설정된 열에는 참조된 값을 사용해야 합니다. 만약 참조된 값이 삭제되면 외래 키 제약 조건이 유지되지 않을 수 있습니다.
- NULL 값 처리: 외래 키는 NULL 값을 허용합니다. 하지만 NULL 값은 부모 테이블의 기본 키와 연결되지 않으므로, 데이터 무결성을 해치지 않습니다.
- 권한: FOREIGN KEY 제약 조건을 추가하거나 삭제할 때는 적절한 권한이 필요합니다. 기본적으로 ALTER 권한이 있어야 합니다.
- 복잡한 쿼리 성능: 외래 키 관계가 많은 경우, 데이터 삽입 및 삭제 시 성능에 영향을 줄 수 있습니다. 데이터베이스의 설계 시 이를 고려해야 합니다.
5. FOREIGN KEY 수정 및 삭제
기존 테이블에서 외래 키 제약 조건을 수정하거나 삭제할 수 있습니다.
5.1. FOREIGN KEY 삭제
ALTER TABLE orders
DROP FOREIGN KEY fk_user;
이 쿼리는 orders
테이블에서 fk_user
라는 외래 키 제약 조건을 삭제합니다.
6. 요약
MySQL FOREIGN KEY는 데이터베이스 테이블 간의 관계를 설정하고 데이터 무결성을 보장하는 데 중요한 역할을 합니다. 외래 키를 사용하면 데이터의 참조 무결성을 유지하고, 관련된 데이터를 쉽게 관리할 수 있습니다.
- 정의: 한 테이블의 열이 다른 테이블의 기본 키를 참조하는 관계 설정.
- 고유성: 외래 키는 NULL을 허용하지만, 참조된 값은 반드시 존재해야 함.
- 데이터 무결성 보장: 참조 무결성을 유지하여 잘못된 데이터 입력 방지.
- Cascade 옵션: 부모 데이터 변경 시 자식 데이터의 자동 처리 가능.
MySQL의 FOREIGN KEY 기능을 활용하여 효율적이고 안정적인 데이터 관리를 수행할 수 있습니다.