공통 시작 상태

부모 행을 지우려는 순간, DBMS는 이 부모를 참조하던 자식 행을 어떻게 정리할지를 `ON DELETE` 옵션으로 결정합니다.

부모
customers(id=1)
자식
orders(id=101, customer_id=1)
같은 삭제 요청
DELETE FROM customers WHERE id = 1;
질문: orders 행은
그대로 둘까, 같이 지울까,
참조만 끊을까?

핵심은 부모 삭제 자체보다, 자식의 최종 상태가 어떻게 바뀌는지입니다.

RESTRICT
삭제 거부

참조 중인 자식 행이 있으므로 부모 삭제를 막습니다. 부모와 자식 모두 그대로 남습니다.

최종 상태
customers(id=1)      유지
orders(customer_id=1) 유지
CASCADE
같이 삭제

부모를 지우면 그 부모를 가리키던 자식 행도 함께 삭제합니다. 연쇄 삭제가 이어질 수 있습니다.

최종 상태
customers(id=1)      삭제
orders(customer_id=1) 삭제
SET NULL
참조만 끊김

자식 행은 남기고 외래 키만 `NULL`로 바꿉니다. 관계는 끊기지만 주문 기록 자체는 유지됩니다.

최종 상태
customers(id=1)         삭제
orders(customer_id=NULL) 유지
SET DEFAULT
기본값으로 대체

자식 행은 남기고 외래 키를 기본값으로 바꿉니다. 보통 `미분류` 같은 기본 대상이 미리 준비되어 있어야 합니다.

최종 상태
customers(id=1)      삭제
orders(customer_id=0) 유지
NO ACTION은 결과만 보면 RESTRICT와 거의 같게 삭제를 막지만, 차이는 검사 시점입니다. RESTRICT는 즉시 거부하고, NO ACTION은 보통 트랜잭션 끝에서 제약을 확인합니다.