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 가 잘못된 거.