PE Notes · DB
참조무결성
외래키가 부모 키이거나 NULL이어야 한다는 참조무결성과 RESTRICT·CASCADE·SET NULL 등 참조 동작을 가르고, 고아 행과 정규화가 늘리는 FK를 정리합니다.
주문을 살렸는데 고객 번호가 어디에도 없으면, 장부는 숫자가 있어도 관계가 깨집니다. 은 자식의 가 부모 기본키이거나 NULL이어야 한다는 규칙입니다. 여섯 제약의 전체 표는 무결성 제약 노트의 몫이고, 여기서는 관계 칸과 삭제 정책만 깊게 갑니다.
키가 가리키는 곳이 있어야 한다
삽입은 없는 부모를 가리키면 거절입니다. 갱신은 부모 키를 바꿀 때 자식이 따라갈지, 막을지를 고릅니다. 삭제는 가장 자주 시험에 나옵니다. 부모를 지울 때 자식을 어떻게 둘 것인가입니다.
은 기본키 자체를 지키고, 참조무결성은 그 키를 누가 가리키느냐를 지킵니다. 전자는 NULL·중복 금지, 후자는 존재 또는 NULL입니다.
| 동작 | 부모를 지울 때 | 자리 |
|---|---|---|
| RESTRICT | 자식이 있으면 거절 | 기본에 가깝고 가장 엄격 |
| 자식 행도 같이 삭제 | 주문과 주문상세 | |
| SET NULL | 자식 FK를 비움 | 부서가 사라진 사원 |
| SET DEFAULT | 지정 기본값으로 옮김 | 기본 카테고리 |
| NO ACTION | 트랜잭션 끝에 다시 검사 | RESTRICT와 비슷, 시점만 다름 |
NO ACTION은 문장 안이 아니라 이 닫힐 때 봅니다. 같은 트랜잭션에서 자식을 먼저 정리하면 통과할 수 있습니다. ON UPDATE도 같은 다섯이 붙습니다. 주문 헤더 번호를 고치는 일은 드물어, 삭제가 실무의 주 질문입니다.
고아 행과 분해의 대가
정책을 안 걸면 부모만 사라지고 자식이 남습니다. 그 잔여가 입니다. 집계는 되고 조인은 비습니다. CASCADE는 고아를 없애되, 실수로 헤더를 지우면 상세가 같이 사라집니다. RESTRICT는 반대입니다. 지우려면 자식을 먼저 치우라는 뜻입니다.
는 테이블을 나누고 FK를 늘립니다. 참조 제약이 많아질수록 이 정책 표가 스키마의 일부가 됩니다. 반정규화는 FK를 줄이지만 중복과 갱신 이상을 다시 엽니다. 트랜잭션의 일관성 칸이 이 제약을 만족해야 커밋이 납니다.
앱에서만 관계를 검사하면 배치·콘솔이 우회합니다. DB FOREIGN KEY가 1차이고, 트리거는 재고처럼 한 키로 안 되는 교차 규칙입니다. 이 값의 집합을 닫으면, 참조는 다른 릴레이션의 존재를 닫습니다.
답안은 정의 한 줄, 개체와 참조의 가름, 동작 다섯, 고아 행, 정규화가 FK를 늘린다는 한 줄을 표에 고정합니다.