DataBase

DB 참조 무결성 제약 (feat. ON DELETE, ON UPDATE)

왈왈디 2025. 1. 19. 23:19
728x90

참조 무결성 제약이란

참조 무결성 제약(Referential Integrity Constraint)이란

데이터베이스에서 외래 키(Foreign Key)가 정의된 경우,

참조되는 테이블(부모 테이블)과 참조하는 테이블(자식 테이블) 간의 관계를 유지하도록 보장하는 제약 조건이다.

이를 통해 데이터의 일관성과 정확성을 유지할 수 있다.

 

참조 무결성 제약의 역할

1. 자식 테이블의 외래 키 값은 반드시 부모 테이블의 기본 키(Primary Key) 값 중 하나이도록 제한한다.

2. 부모 테이블에서 데이터를 삭제하거나 수정할 때 자식 테이블의 외래 키 값이 어떻게 처리될지를 결정한다.

 

참조 무결성 제약의 4가지 옵션

외래 키를 정의할 때

부모 테이블의 데이터 변경(삭제 또는 수정)이 자식 테이블에 미치는 영향을 제어하기 위해 4가지 옵션이 있다.

 

1. CASCADE

삭제: 부모 테이블의 행이 삭제면, 자식 테이블에서 해당하는 외래 키 값을 갖는 행도 자동으로 삭제 된다.

ex) 부모 테이블의 id=1인 행을 삭제하면, 자식 테이블의 foreign_key=1인 행도 함께 삭제된다.

 

수정: 외래 키로 사용된 부모 테이블의 컬럼 값이 수정되면, 자식 테이블에 해당하는 외래 키 값도 자동으로 수정된다.

ex) 부모 테이블의 id=1 id=2로 수정되면, 자식 테이블의 foreign_key 2로 수정된다.

ON DELETE CASCADE
ON UPDATE CASCADE

 

2. SET NULL

부모 테이블의 행이 삭제되거나 수정되면, 자식 테이블의 외래 키 값을 NULL로 설정한다.

다만, 자식 테이블의 외래 키가 NOT NULL로 정의되어 있으면 사용할 수 없다.

 

ex)

- 삭제: 부모 테이블의 id=1이 삭제되면, 자식 테이블에서 foreign_key=1인 값은 NULL로 설정된다.

- 수정: 부모 테이블의 id=1이 수정되면, 자식 테이블의 foreign_keyNULL이 된다.

ON DELETE SET NULL
ON UPDATE SET NULL

 

3. SET DEFAULT

부모 테이블의 행이 삭제되거나 수정되면, 자식 테이블의 외래 키 값을 기본값(DEFAULT)으로 설정한다.

다만, 자식 테이블의 외래 키 컬럼에 기본값(DEFAULT 값)이 설정되어 있어야만 사용할 수 있다.

 

ex)

- 삭제: 부모 테이블의 id=1이 삭제되면, 자식 테이블의 foreign_key=1인 값이 미리 정의된 기본값으로 변경된다.

- 수정: 부모 테이블의 id=1이 수정되면, 자식 테이블의 foreign_key는 기본값으로 변경된다.

ON DELETE SET DEFAULT
ON UPDATE SET DEFAULT

 

4. RESTRICT

부모 테이블의 행을 삭제하거나 foreign key 컬럼 값을 수정하려 할 때, 자식 테이블에 관련된 데이터가 존재하면 오류가 발생하고 작업이 취소된다.

 

ex)

- 삭제: 부모 테이블의 id=1인 행을 삭제하려 할 때, 자식 테이블에 foreign_key=1인 데이터가 있으면 삭제되지 않고 에러가 발생한다.

- 수정: 부모 테이블의 id=1인 행의 id 컬럼을 다른 값으로 수정하려 해도 자식 테이블에 영향을 주지 않으며, 수정 작업이 차단되고 에러가 발생한다.

ON DELETE RESTRICT
ON UPDATE RESTRICT

 

예시

SQL 예시

-- 부모 테이블 생성
CREATE TABLE parent (
    id INT PRIMARY KEY,          -- 부모 테이블의 기본 키
    name VARCHAR(50) NOT NULL    -- 부모 테이블의 다른 컬럼
);

-- 자식 테이블 생성 (외래 키 제약 조건 포함)
CREATE TABLE child (
    id INT PRIMARY KEY,          -- 자식 테이블의 기본 키
    parent_id INT,               -- 외래 키 컬럼
    description VARCHAR(100),    -- 자식 테이블의 다른 컬럼
    FOREIGN KEY (parent_id) REFERENCES parent(id)
    ON DELETE CASCADE            -- 부모 테이블 행 삭제 시 자식 행도 삭제
    ON UPDATE SET NULL           -- 부모 테이블 행 수정 시 자식 외래 키를 NULL로 설정
);

 

Prisma 예시

// schema.prisma
model Parent {
  id       Int      @id @default(autoincrement()) // 기본 키, 자동 증가
  name     String   // 부모 테이블의 컬럼
  children Child[]  // 자식 테이블과의 관계
}

model Child {
  id          Int     @id @default(autoincrement()) // 기본 키, 자동 증가
  parentId    Int?    // 외래 키 (nullable)
  description String  // 자식 테이블의 다른 컬럼

  // 외래 키 관계 설정
  parent Parent? @relation(fields: [parentId], references: [id], 
                           onDelete: Cascade, 
                           onUpdate: SetNull)
}
728x90