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

Foreign Key 와 관계

~14 min · schema, relationships

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Cross-reference

FK 는 cross-reference — 값이 다른 테이블 PK 와 매치돼야 하는 컬럼. PostgreSQL 이 모든 INSERT/UPDATE 에서 강제 → 존재하지 않는 customer 가리키는 order 절대 못 만듦.

네 가지 ON DELETE 동작

참조 받는 행을 삭제하면 어떻게 됨?

  • NO ACTION / RESTRICT (default): 삭제 거절. 자식 존재가 부모 삭제 막아야 할 때 (정리 후 삭제).
  • CASCADE: 부모랑 같이 자식 자동 삭제. '소유' 관계 — order_items 가 order 에 속함; order 가 가면 item 도 같이.
  • SET NULL: 자식 행 유지하되 참조 잃음. 선택적 연관 — author 삭제되면 article 이 author 잃음.
  • SET DEFAULT: 자식 행이 컬럼 default 받음 (드뭄; '삭제된 유저' sentinel 행 정의했을 때만 보통 의미 있음).

ON UPDATE

ON DELETE 의 대칭이지만 거의 필요 없음 — PK 는 불변이어야. ON UPDATE CASCADE 잡으려 하면 PK 가 잘못된 거.

Code

부모/자식 관계 셋업·sql
CREATE TABLE departments (
    id   INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name TEXT UNIQUE NOT NULL
);

CREATE TABLE employees (
    id            INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name          TEXT NOT NULL,
    department_id INTEGER REFERENCES departments(id) ON DELETE SET NULL
);

-- 됨:
INSERT INTO departments (name) VALUES ('Engineering');
INSERT INTO employees (name, department_id) VALUES ('Alice', 1);

-- 거절:
INSERT INTO employees (name, department_id) VALUES ('Bob', 99);
-- ERROR: insert or update on table "employees" violates foreign key constraint
소유 자식 위한 CASCADE·sql
CREATE TABLE orders (
    id       INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    customer_id INTEGER NOT NULL REFERENCES customers(id) ON DELETE RESTRICT,
    placed_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE order_items (
    id        INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    order_id  INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
    product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE RESTRICT,
    quantity  INTEGER NOT NULL CHECK (quantity > 0)
);
-- order 삭제 → item 삭제 cascade.
-- order 있는 customer 삭제 → 거절 (RESTRICT).

External links

Exercise

갖고 있는 스키마의 부모/자식 관계 골라. 현재 ON DELETE 동작을 한 문장으로 정당화. 답이 '몰라' 면 진짜 버그 — 알아내고 문서화.

Progress

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

댓글 0

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

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