Parent가 죽으면 child는 어떻게 되나
FK를 선언할 때, parent row가 지워지거나 바뀌면 SQLite가 뭘 할지 참조 동작으로 지정할 수 있어. 쓸 만한 게 다섯 가지야.
- NO ACTION — 기본값이야. child를 미아로 만드는 작업이면 거부해.
- RESTRICT — NO ACTION과 같은데 더 일찍 막아. 미루지 않고 그 자리에서 검사하거든.
- CASCADE — parent를 지우면 child도 같이 지워. 업데이트도 따라가게 할 수 있어.
- SET NULL — child의 FK 컬럼을 NULL로 비워. 그 컬럼이 NULL을 받을 수 있어야 해.
- SET DEFAULT — 컬럼에 걸린 default 값으로 갈아끼워.
Warning: parent 테이블에 걸린
ON DELETE CASCADE는 statement 한 줄로 거대한 하위 트리를 통째로 날려버릴 수 있어. 그게 이 기능의 핵심인 동시에, 오타 하나짜리 DELETE가 엄청난 피해를 내는 이유이기도 해. 위험이 큰 parent라면 NO ACTION으로 두고 정리 query를 따로 쓰거나, 안전 검사를 넣은 transaction으로 감싸는 게 나아.