C.W.K.
Stream
Lesson 07 of 10 · published

ON DELETE — Cascade, SET NULL, RESTRICT

~12 min · foreign-keys, cascade, constraints

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Parent 죽으면 child 어떻게

FK 선언 시 parent row 삭제/업데이트 때 SQLite 가 취하는 참조 동작 명시 가능. 의미 있는 4 옵션:

  • NO ACTION (기본) — child orphan 만들면 거부.
  • RESTRICT — NO ACTION 과 같은데 더 빨리 enforce (immediate, deferred 아님).
  • CASCADE — parent 와 함께 child 도 삭제 (또는 업데이트).
  • SET NULL — child 의 FK 컬럼 null 처리. 컬럼이 nullable 이어야 함.
  • SET DEFAULT — 컬럼 default 값으로 교체.
Warning: Parent 테이블의 ON DELETE CASCADE 가 statement 한 줄로 거대 sub-tree 날릴 수 있어. 그게 핵심인데 — 동시에 typo DELETE 가 엄청난 피해. 위험 큰 parent 면 NO ACTION + 명시적 cleanup query 가 낫거나, 안전 체크 있는 transaction 으로 감싸.

Code

3 가지 참조 동작 한 예제에·sql
CREATE TABLE conversations (id INTEGER PRIMARY KEY, title TEXT) STRICT;

CREATE TABLE messages (
  id INTEGER PRIMARY KEY,
  conversation_id INTEGER NOT NULL
    REFERENCES conversations(id) ON DELETE CASCADE,   -- conv 와 함께 msg 삭제
  role TEXT NOT NULL, content TEXT NOT NULL
) STRICT;

CREATE TABLE attachments (
  id INTEGER PRIMARY KEY,
  message_id INTEGER
    REFERENCES messages(id) ON DELETE SET NULL,        -- attachment 유지, link 만 잃음
  url TEXT NOT NULL
) STRICT;

CREATE TABLE summaries (
  id INTEGER PRIMARY KEY,
  conversation_id INTEGER NOT NULL
    REFERENCES conversations(id) ON DELETE RESTRICT    -- summary 있으면 삭제 차단
) STRICT;

External links

Exercise

위 3-테이블 예제 빌드. 샘플 row insert. 시도: (1) message 있는 conversation 삭제 — CASCADE 관찰, (2) attachment 있는 message 삭제 — SET NULL 관찰, (3) summary 있는 conversation 삭제 — RESTRICT 차단 관찰. 각각 실제 제품에서 원하는 동작인지 기록.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.