참조 무결성은 연결의 유효성을 지킨다. CHECK와 NOT NULL은 저장할 값의 조건을 각각 맡는다.
loans.book_id가 books.book_id를 참조하면 존재하지 않는 책번호로 대출을 추가할 수 없다. 책 한 권을 여러 번 빌릴 수 있으므로 외래키 값 자체는 중복될 수 있다.
pages에 CHECK(pages > 0)만 걸면 음수는 거절하지만 NULL은 허용된다. CHECK는 조건이 거짓일 때 거절하고 미정인 경우에는 통과한다. 값이 반드시 있어야 한다면 NOT NULL을 따로 선언한다.
부모 행 삭제 때 자식도 지울지, 삭제를 막을지, NULL로 바꿀지는 참조 동작을 정해 결정한다. 학습 기록을 보존해야 하는 업무에서 CASCADE를 습관적으로 붙이지 않는다.
- 01 →
행의 식별
- 02 →
연결의 유효성
- 03 →
값의 범위
- 04
값의 존재
같은 상황에서 비교하기
| 개념 | 기준 | 확인할 점 |
|---|---|---|
| PRIMARY KEY | 자기 행의 식별 | 중복·NULL을 금지한다 |
| FOREIGN KEY | 참조 대상의 존재 | 참조 열의 NULL 허용 여부는 별도다 |
| CHECK | 값이 조건에 맞는가 | NULL 금지와 다르다 |
| NOT NULL | 값이 있는가 | 범위 검사는 하지 않는다 |
도서관 예제로 따라가기
CREATE TABLE books (
book_id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
shelf_code TEXT REFERENCES shelves(code),
pages INTEGER CHECK (pages > 0)
);쪽수 0은 거절된다. 쪽수 NULL은 허용된다. loans의 책번호는 별도 FOREIGN KEY로 books에 연결한다.
공통 예제 데이터 보기
| book_id | title | shelf_code | pages |
|---|---|---|---|
| 1 | SQL 입문 | DB | 120 |
| 2 | 설계 노트 | SW | 200 |
| 3 | 관계 모델 | DB | NULL |
| 4 | 분산 읽기 | NULL | 160 |
| loan_id | book_id |
|---|---|
| 11 | 1 |
| 12 | 1 |
| 13 | 2 |
내 말로 설명해 보기
CHECK(pages > 0)에서 NULL이 통과하는 이유와 막는 방법은?
설명 예시 확인
NULL과의 비교는 미정이다. CHECK는 미정을 거절하지 않으므로 값이 필요하면 NOT NULL을 함께 쓴다.
참고한 자료
이전 개념 자료와의 연결
이전 자료에서 다룬 주제를 이어받아 설명과 예시를 다시 썼어요.
- 도메인·CHECK·NULL 제약
- 외래키와 참조 무결성