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

NULL vs NOT NULL

~12 min · schema, null

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

NULL 은 0 도, 빈 문자열도, false 도 아님

NULL 은 DB 가 "몰라" 라고 말하는 방식. 숫자 0 아님. 빈 문자열 아님. boolean false 아님. 값의 부재 — 채워진 적 없는 폼의 빈칸.

NULL 은 전염성

NULL 포함된 모든 연산이 NULL 반환. 5 + NULL 은 NULL. 'hi' || NULL 은 NULL. NULL = NULL 은 NULL (true 아님!). 그래서 모든 NULL 체크는 IS NULL / IS NOT NULL, 절대 = NULL 아님.

기본은 NOT NULL

'몰라' 상태를 진짜로 표현해야 할 게 아니면 모든 컬럼을 NOT NULL. 필요 없는 곳에 NULL 허용 = "NULL 이면 어떡해?" 의 부담을 데이터 모든 소비자에게 — 그리고 그들은 잊어버려.

IS DISTINCT FROM 연산자

NULL-safe equality (NULL 이 일반 값처럼 동작) 필요하면 IS DISTINCT FROM 이랑 IS NOT DISTINCT FROM. NULL = NULL 을 TRUE 로 처리, 다른 곳선 FALSE — 예측 가능, 스크립트 가능, 3-값 로직 없음.

Code

스키마 레벨 NULL 규율·sql
CREATE TABLE contacts (
    id    INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name  TEXT NOT NULL,           -- 항상 필수
    phone TEXT,                    -- 의도적 선택
    bio   TEXT NOT NULL DEFAULT '' -- 항상 존재, default 빈 문자열
);
WHERE 의 NULL 함정·sql
-- 틀림: 아무것도 안 매치 (NULL = NULL 은 NULL, TRUE 아님)
SELECT * FROM contacts WHERE phone = NULL;

-- 맞음
SELECT * FROM contacts WHERE phone IS NULL;
SELECT * FROM contacts WHERE phone IS NOT NULL;

-- NULL-safe equality
SELECT * FROM contacts WHERE phone IS NOT DISTINCT FROM '555-1212';
Aggregate 가 NULL 조용히 스킵·sql
SELECT
    COUNT(*)         AS total_rows,
    COUNT(phone)     AS rows_with_phone,
    COUNT(DISTINCT phone) AS distinct_phones
FROM contacts;
-- COUNT(*) 모든 행 (NULL 포함).
-- COUNT(column) non-NULL 만.

External links

Exercise

프로젝트에서 nullable 인데 그러면 안 될 컬럼 찾기. NOT NULL 추가 마이그레이션 스케치 (기존 NULL 먼저 백필 필요). NULL 이 거기서 불가능해지면 깨질 코드 식별.

Progress

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

댓글 0

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

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