MySQL의 외래 키(Foreign Key)는 두 테이블 간의 관계를 정의할 때 사용되는 중요한 개념입니다.
이 글에서는 외래 키의 개념을 간단한 예제와 함께 살표보겠습니다.
외래 키 정의
외래 키(Foreign Key)는 한 테이블의 열(column)이 다른 테이블의 기본 키(Primary Key)와 연결되어 두 테이블 간의 관계를 정의하는 열을 말합니다. 이 관계를 통해 데이터의 무결성을 유지할 수 있으며, 데이터베이스에서 데이터가 유효한 상태로 유지되도록 합니다.
예를 들어, 쇼핑몰 데이터베이스에서 Orders
(주문) 테이블과 Customers
(고객) 테이블이 있을 때, 주문은 반드시 고객과 연관이 있어야 하므로 Orders
테이블에 Customers
테이블의 기본 키를 외래 키로 설정할 수 있습니다.
외래 키의 장점
- 데이터 무결성 유지: 외래 키는 데이터베이스에서 일관된 데이터를 보장합니다. 예를 들어, 고객이 삭제되면 그와 관련된 주문 정보도 삭제될 수 있습니다.
- 참조 무결성 유지: 테이블 간의 데이터 관계를 명확히 하여 참조 무결성을 확보할 수 있습니다.
- 자동 삭제/업데이트: 외래 키를 설정하면 부모 테이블의 데이터가 삭제되거나 업데이트될 때 자식 테이블의 데이터도 자동으로 처리할 수 있습니다.
예제
Customers
와 Orders
테이블을 예로 들어 외래 키를 설정하는 방법을 설명하겠습니다.
1. 테이블 생성
먼저 두 테이블을 생성합니다. Customers
테이블에는 고객 정보가 저장되고, Orders
테이블에는 주문 정보가 저장됩니다. 여기서 Orders
테이블의 customer_id
열이 Customers
테이블의 id
열을 참조하는 외래 키입니다.
CREATE TABLE Customers (
id INT AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100),
PRIMARY KEY (id)
);
CREATE TABLE Orders (
id INT AUTO_INCREMENT,
order_date DATE,
customer_id INT,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES Customers(id)
);
2. 외래 키 제약 조건 추가
Orders
테이블에서 customer_id
는 Customers
테이블의 id
를 참조하는 외래 키입니다. 이로 인해 주문을 추가할 때 해당 주문의 고객이 반드시 Customers
테이블에 존재해야 합니다.
3. 데이터 삽입
고객과 주문 데이터를 삽입할 때는 먼저 Customers
테이블에 고객 정보를 삽입한 후, 그 고객의 ID를 사용해 Orders
테이블에 주문 정보를 삽입해야 합니다.
-- 고객 데이터 삽입
INSERT INTO Customers (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO Customers (name, email) VALUES ('Bob', 'bob@example.com');
-- 주문 데이터 삽입
INSERT INTO Orders (order_date, customer_id) VALUES ('2024-10-10', 1);
INSERT INTO Orders (order_date, customer_id) VALUES ('2024-10-11', 2);
4. 외래 키 삭제/업데이트 동작
외래 키를 사용할 때는 부모 테이블의 데이터가 삭제되거나 업데이트될 때 자식 테이블에서 어떻게 처리할지를 설정할 수 있습니다.
예를 들어, 고객이 삭제될 때 관련된 주문도 함께 삭제하려면 ON DELETE CASCADE
옵션을 사용할 수 있습니다.
CREATE TABLE Orders (
id INT AUTO_INCREMENT,
order_date DATE,
customer_id INT,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES Customers(id) ON DELETE CASCADE
);
이 설정을 통해 고객 정보가 삭제되면 관련된 주문 정보도 자동으로 삭제됩니다.
'Database > MySQL' 카테고리의 다른 글
[MySQL] 제약조건(Constraints): 데이터 무결성 유지하기 (0) | 2024.10.11 |
---|---|
[MySQL] 테이블 연결하기 (JOIN) - INNER / OUTER / LEFT / RIGHT / CROSS / SELF (0) | 2024.10.11 |
[MySQL] 조건문 - IF / IFNULL / CASE~WHEN (0) | 2024.10.10 |
[MySQL] 데이터 그룹화 - GROUP BY / HAVING (0) | 2024.10.10 |
[MySQL] 문자열 함수 / 숫자 함수 / 날짜, 시간 함수 (0) | 2024.10.10 |