728x90
MySQL 외래 키 옵션: ON DELETE / ON UPDATE
MySQL에서 외래 키(FK)를 설정할 때 ON DELETE
와 ON UPDATE
옵션은 부모 테이블의 데이터가 삭제되거나 업데이트될 때 자식 테이블을 어떻게 처리할지를 정의합니다.
옵션 종류
- CASCADE
- 부모가 삭제/업데이트되면, 자식도 함께 삭제/업데이트
- 주로 부모-자식 관계에서 데이터 일괄 관리 시 사용
- SET NULL
- 부모가 삭제/업데이트되면, 자식의 FK 컬럼을
NULL
로 설정 - 자식 FK 컬럼이
NULL
허용이어야 함
- 부모가 삭제/업데이트되면, 자식의 FK 컬럼을
- NO ACTION
- 부모를 삭제/업데이트해도 자식에 영향 없음
- 자식이 참조 중이면 부모 작업이 거부됨 (실제론
RESTRICT
와 동일)
- RESTRICT
- 부모를 삭제/업데이트할 때 자식이 참조 중이면 즉시 거부
NO ACTION
과 유사하나, MySQL이 즉시 검사
- SET DEFAULT
- 부모가 삭제/업데이트되면, 자식의 FK 컬럼을 기본값으로 설정
- MySQL에서는 미지원 (PostgreSQL 등에서 사용)
동작 요약
옵션 | ON DELETE 동작 | ON UPDATE 동작 |
---|---|---|
CASCADE | 자식 행도 함께 삭제 | 자식 FK 값도 함께 업데이트 |
SET NULL | 자식 FK 값이 NULL 로 변경 |
자식 FK 값이 NULL 로 변경 |
NO ACTION | 참조 중이면 삭제/업데이트 거부 | 참조 중이면 삭제/업데이트 거부 |
RESTRICT | 참조 중이면 삭제/업데이트 거부 | 참조 중이면 삭제/업데이트 거부 |
SET DEFAULT | (미지원) 자식 FK 값을 기본값으로 설정 | (미지원) 자식 FK 값을 기본값으로 설정 |
사용 예제
1. CASCADE (함께 삭제/업데이트)
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
/* 부모 삭제 시 자식도 삭제 */
INSERT INTO parent VALUES (1);
INSERT INTO child VALUES (1, 1);
DELETE FROM parent WHERE id = 1;
/* child 테이블: 0 rows */
2. SET NULL (NULL
처리)
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT NULL,
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE SET NULL
ON UPDATE SET NULL
);
3. RESTRICT / NO ACTION (참조 거부)
CREATE TABLE parent (
id INT PRIMARY KEY
);
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE RESTRICT
ON UPDATE RESTRICT
);
/* 참조 중인 부모 삭제 시 에러 */
INSERT INTO parent VALUES (1);
INSERT INTO child VALUES (1, 1);
DELETE FROM parent WHERE id = 1;
-- ERROR: Cannot delete or update a parent row: a foreign key constraint fails
주의사항
- 테이블 생성 순서: 외래 키를 지정할 때, 부모 테이블이 먼저 존재해야 합니다.
- SET NULL 사용 시: 자식 FK 컬럼에
NULL
허용(NULLABLE
)을 설정해야 에러가 발생하지 않습니다. - NO ACTION vs RESTRICT: MySQL에서는 두 옵션이 거의 동일하게 동작합니다.
- MySQL 미지원:
SET DEFAULT
옵션은 MySQL에서 지원되지 않습니다.
728x90
'DB' 카테고리의 다른 글
[MySQL] WITH RECURSIVE( 재귀 ) (0) | 2024.12.16 |
---|---|
[ MySQL] WITH 절 (0) | 2024.12.16 |
[MySQL] Query 성능 향상 _ 1(JOIN 및 SUM, COUNT) (0) | 2024.12.16 |
[MySQL] 복합 인덱스(Multiple-Column Indexes) (0) | 2024.12.12 |
[MySQL] Index 공식 문서 읽어 보기 (0) | 2024.12.12 |