본문 바로가기
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가 뭘 할지 참조 동작으로 지정할 수 있어. 쓸 만한 게 다섯 가지야.

  • 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으로 감싸는 게 나아.

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

위 세 테이블 예제를 직접 만들고 표본 row를 넣어봐. 그리고 세 가지를 시도해. message가 달린 conversation을 지워서 CASCADE가 도는 걸 보고, attachment가 달린 message를 지워서 SET NULL이 도는 걸 보고, summary가 달린 conversation을 지워서 RESTRICT가 막는 걸 봐. 각각이 실제 제품에서 네가 원하는 동작인지 적어둬.

Progress

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

댓글 0

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

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