Home

MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장

Published in mysql_maria
August 24, 2025
3 min read
MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장

안녕하세요, 코딩하는곰입니다! 오늘은 MySQL과 MariaDB에서 데이터 무결성을 보장해주는 중요한 기능인 FOREIGN KEY(외래 키)에 대해 깊이 있게 알아보겠습니다. 관계형 데이터베이스의 핵심 개념 중 하나인 외래 키는 테이블 간의 관계를 설정하고 데이터의 일관성을 유지하는 데 필수적인 요소입니다. 20년 이상의 데이터베이스 개발 경험을 바탕으로 외래 키의 설정 방법부터 실제 활용 팁까지 상세히 설명드리겠습니다.

MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장
MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장


💻 프로그래밍에 관심이 많다면, (파이썬) 세트(Set) 자료형 완벽 가이드 중복 제거부터 집합 연산까지를 참고해보세요.

FOREIGN KEY의 기본 개념과 중요성

FOREIGN KEY(외래 키)는 관계형 데이터베이스에서 두 테이블 간의 관계를 정의하는 제약 조건입니다. 한 테이블의 컬럼이 다른 테이블의 기본 키(Primary Key)나 유니크 키(Unique Key)를 참조함으로써 데이터의 참조 무결성을 보장합니다.

외래 키의 주요 기능

  1. 참조 무결성 보장: 자식 테이블에 존재하는 외래 키 값은 반드시 부모 테이블에 존재해야 합니다
  2. 데이터 일관성 유지: 관련된 테이블 간의 데이터가 항상 일관된 상태를 유지하도록 합니다
  3. 계층적 데이터 관리: 테이블 간의 부모-자식 관계를 명확히 정의합니다

외래 키 제약 조건의 구성 요소

  • 부모 테이블(Parent Table): 참조되는 테이블 (기본 키를 가진 테이블)
  • 자식 테이블(Child Table): 참조하는 테이블 (외래 키를 가진 테이블)
  • 참조 컬럼(Referenced Column): 부모 테이블에서 참조되는 컬럼
  • 외래 키 컬럼(Foreign Key Column): 자식 테이블에서 참조하는 컬럼

외래 키와 인덱스의 관계

MySQL과 MariaDB에서는 외래 키를 생성할 때 자동으로 해당 컬럼에 인덱스가 생성됩니다. 이는 참조 무결성 검사 성능을 최적화하기 위한 중요한 기능입니다.

-- 외래 키 생성 시 자동으로 인덱스가 생성되는 예제
CREATE TABLE parent_table (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE child_table (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent_table(id)
-- parent_id 컬럼에 자동으로 인덱스가 생성됨
);

MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장
MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장


💡 개발 프로젝트 아이디어가 필요하다면, (자바 기초) 타입 변환 완벽 가이드 자동(Widening) vs 강제(Narrowing) 형변환를 참고해보세요.

FOREIGN KEY 설정 방법: 실제 구현 가이드

1. 테이블 생성 시 외래 키 설정하기

기본 문법

CREATE TABLE child_table (
column1 datatype,
column2 datatype,
...
FOREIGN KEY (foreign_key_column)
REFERENCES parent_table (parent_column)
[ON DELETE reference_option]
[ON UPDATE reference_option]
);

실제 예제

-- 부모 테이블 생성
CREATE TABLE departments (
department_id INT PRIMARY KEY AUTO_INCREMENT,
department_name VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 자식 테이블 생성 (외래 키 포함)
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
department_id INT,
hire_date DATE,
salary DECIMAL(10,2),
-- 외래 키 설정
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE SET NULL
ON UPDATE CASCADE,
INDEX idx_department (department_id)
);

2. 기존 테이블에 외래 키 추가하기

ALTER TABLE 사용법

ALTER TABLE child_table
ADD CONSTRAINT constraint_name
FOREIGN KEY (foreign_key_column)
REFERENCES parent_table (parent_column)
[ON DELETE reference_option]
[ON UPDATE reference_option];

실제 예제

-- 기존 테이블에 외래 키 추가
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customers
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE RESTRICT
ON UPDATE CASCADE;
-- 복합 외래 키 추가 예제
ALTER TABLE order_items
ADD CONSTRAINT fk_order_items_orders
FOREIGN KEY (order_id, product_id)
REFERENCES orders(order_id, product_id)
ON DELETE CASCADE;

3. 외래 키 옵션 상세 설명

ON DELETE 옵션

  • CASCADE: 부모 테이블의 행이 삭제될 때 자식 테이블의 관련 행도 함께 삭제
  • SET NULL: 부모 테이블의 행이 삭제될 때 자식 테이블의 외래 키 값을 NULL로 설정
  • RESTRICT: 부모 테이블의 행 삭제를 방지 (기본값)
  • NO ACTION: RESTRICT와 유사하게 동작
  • SET DEFAULT: 부모 테이블의 행이 삭제될 때 자식 테이블의 외래 키 값을 기본값으로 설정

ON UPDATE 옵션

  • CASCADE: 부모 테이블의 기본 키 값이 변경될 때 자식 테이블의 외래 키 값도 함께 변경
  • SET NULL: 부모 테이블의 기본 키 값이 변경될 때 자식 테이블의 외래 키 값을 NULL로 설정
  • RESTRICT: 부모 테이블의 기본 키 값 변경을 방지
  • NO ACTION: RESTRICT와 유사하게 동작
  • SET DEFAULT: 부모 테이블의 기본 키 값이 변경될 때 자식 테이블의 외래 키 값을 기본값으로 설정

4. 복합 외래 키 설정하기

-- 복합 기본 키를 가진 부모 테이블
CREATE TABLE order_details (
order_id INT,
product_id INT,
quantity INT,
price DECIMAL(10,2),
PRIMARY KEY (order_id, product_id)
);
-- 복합 외래 키를 가진 자식 테이블
CREATE TABLE shipments (
shipment_id INT PRIMARY KEY,
order_id INT,
product_id INT,
shipment_date DATE,
status VARCHAR(20),
FOREIGN KEY (order_id, product_id)
REFERENCES order_details(order_id, product_id)
ON DELETE CASCADE
);

MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장
MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장


회원가입이나 비밀번호 변경 시 안전한 비밀번호를 빠르게 생성할 수 있는 온라인 도구가 유용합니다.

외래 키 관리와 모범 사례

외래 키 확인 및 관리 방법

외래 키 정보 조회하기

-- 특정 테이블의 외래 키 정보 조회
SELECT
TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'your_table_name'
AND REFERENCED_TABLE_NAME IS NOT NULL;
-- 더 상세한 외래 키 정보
SELECT
rc.CONSTRAINT_NAME,
rc.TABLE_NAME,
rc.REFERENCED_TABLE_NAME,
rc.UPDATE_RULE,
rc.DELETE_RULE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
WHERE rc.CONSTRAINT_SCHEMA = 'your_database_name';

외래 키 제약 조건 삭제하기

-- 외래 키 제약 조건 삭제
ALTER TABLE child_table
DROP FOREIGN KEY constraint_name;
-- 인덱스는 별도로 삭제해야 함 (필요한 경우)
ALTER TABLE child_table
DROP INDEX index_name;

외래 키 사용 시 주의사항과 모범 사례

1. 데이터 타입 일치

외래 키 컬럼과 참조 컬럼의 데이터 타입은 정확히 일치해야 합니다.

-- 올바른 예: 데이터 타입이 완전히 일치
CREATE TABLE parent (
id INT UNSIGNED PRIMARY KEY
);
CREATE TABLE child (
parent_id INT UNSIGNED,
FOREIGN KEY (parent_id) REFERENCES parent(id)
);
-- 잘못된 예: 데이터 타입이 일치하지 않음
CREATE TABLE child_error (
parent_id INT, -- UNSIGNED가 아님
FOREIGN KEY (parent_id) REFERENCES parent(id) -- 에러 발생
);

2. 인덱스 고려사항

  • 외래 키 컬럼에는 자동으로 인덱스가 생성됨
  • 복합 외래 키의 경우 인덱스 순서가 중요함
  • 불필요한 인덱스는 성능 저하를 초래할 수 있음

3. 성능 최적화 팁

-- 대량 데이터 삽입 시 외래 키 검사 일시적 비활성화
SET foreign_key_checks = 0;
-- 대량의 데이터 삽입 작업 수행
INSERT INTO child_table (...) VALUES (...), (...), ...;
-- 외래 키 검사 다시 활성화
SET foreign_key_checks = 1;
-- 외래 키 검사 후 무결성 확인
CHECK TABLE child_table;

4. 실제 프로젝트에서의 적용 예제

-- 전자상거래 시스템 예제
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE user_addresses (
address_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
address_type ENUM('home', 'work', 'other') DEFAULT 'home',
street VARCHAR(255),
city VARCHAR(100),
zip_code VARCHAR(20),
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
INDEX idx_user_address (user_id, address_type)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10,2),
status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled'),
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON DELETE RESTRICT -- 사용자 삭제 시 주문이 있으면 삭제 방지
ON UPDATE CASCADE,
INDEX idx_user_orders (user_id, order_date)
);

5. 외래 키와 트랜잭션

외래 키는 트랜잭션과 함께 사용될 때 진가를 발휘합니다. 여러 테이블에 걸친 데이터 변경 작업의 원자성을 보장합니다.

START TRANSACTION;
-- 여러 테이블에 걸친 작업 수행
INSERT INTO parent_table (...) VALUES (...);
INSERT INTO child_table (parent_id, ...) VALUES (LAST_INSERT_ID(), ...);
-- 외래 키로 인해 무결성이 자동으로 검증됨
COMMIT;

MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장
MySQL/MariaDB FOREIGN KEY 완벽 가이드 - 외래 키 설정과 데이터 무결성 보장


인터넷을 사용할 때 우리가 사용하는 IP는 생각보다 많은 정보를 담고 있습니다. 아이피 기반 위치 조회로 간단히 알아볼 수 있습니다.

FOREIGN KEY는 MySQL과 MariaDB에서 데이터 무결성을 보장하는 강력한 도구입니다. 적절하게 설계되고 구현된 외래 키는 데이터베이스의 신뢰성을 크게 향상시킬 수 있습니다. 하지만 성능 implications을 이해하고 상황에 맞는 옵션을 선택하는 것이 중요합니다. 실제 프로젝트에서는 데이터 모델링 단계에서부터 외래 키 관계를 신중하게 설계하고, ON DELETE/ON UPDATE 옵션을業務需求에 맞게 설정하는 것이 좋습니다. 항상 외래 키의 존재를 인지하고 개발하며, 필요時에는 temporary로 foreign key checks를 disable하는 방법도 기억해두세요. 다음 포스팅에서는 외래 키의 고급 활용법과 troubleshooting 방법에 대해 더 깊이 알아보겠습니다!

두뇌 건강을 위해 매일 스도쿠를 풀고 싶다면, AI 기반 힌트와 스토리 모드를 제공하는 스도쿠 저니를 다운로드해보세요.









최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기
최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기



다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기
다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기



비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기
비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기




Tags

#developer#coding#mysql_maria

Share

Previous Article
JavaScript 화살표 함수 완벽 가이드 this 바인딩과 간결한 문법의 모든 것

Table Of Contents

1
FOREIGN KEY의 기본 개념과 중요성
2
FOREIGN KEY 설정 방법: 실제 구현 가이드
3
외래 키 관리와 모범 사례

Related Posts

MySQL/MariaDB 필수 통계 함수 완벽 가이드 COUNT, SUM, AVG 활용법과 실무 예제
December 31, 2025
3 min