DB

[MySQL] 외래키 참조 무결

Raconer 2024. 12. 16. 00:28
728x90

MySQL 외래 키 옵션: ON DELETE / ON UPDATE

MySQL에서 외래 키(FK)를 설정할 때 ON DELETEON UPDATE 옵션은 부모 테이블의 데이터가 삭제되거나 업데이트될 때 자식 테이블을 어떻게 처리할지를 정의합니다.

옵션 종류

  1. CASCADE
    • 부모가 삭제/업데이트되면, 자식도 함께 삭제/업데이트
    • 주로 부모-자식 관계에서 데이터 일괄 관리 시 사용
  2. SET NULL
    • 부모가 삭제/업데이트되면, 자식의 FK 컬럼을 NULL로 설정
    • 자식 FK 컬럼이 NULL 허용이어야 함
  3. NO ACTION
    • 부모를 삭제/업데이트해도 자식에 영향 없음
    • 자식이 참조 중이면 부모 작업이 거부됨 (실제론 RESTRICT와 동일)
  4. RESTRICT
    • 부모를 삭제/업데이트할 때 자식이 참조 중이면 즉시 거부
    • NO ACTION과 유사하나, MySQL이 즉시 검사
  5. 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