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

Default Value & Generated Column

~14 min · schema, defaults

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

믿을 수 있는 auto-fill

Default 가 DB 의 auto-fill. INSERT 가 컬럼 스킵하면 default 발동. INSERT terse 하게 유지, 데이터 일관성 유지, 'X 설정 잊었어' 카테고리 버그 제거.

Static, expression, generated

세 종류, 위력 순:

  • Static default: 리터럴 값 — 0, 'draft', FALSE.
  • Expression default: INSERT 시점에 계산 — now(), CURRENT_DATE, gen_random_uuid(), encode(gen_random_bytes(32),'hex').
  • Generated column: 같은 행의 다른 컬럼 에서 계산 — STORED (디스크 기록) 또는 VIRTUAL (read 시 계산; PG 18+).

Generated column 이 값을 함

Generated column 이 공식에서 값 도출. INSERT/UPDATE 직접 불가 — DB 가 정확하게 유지. 앱에서 천 번 계산할 derived value 에 써: full name, 세금 포함 total, slugified title, 정규화된 검색 term.

Code

Static + expression default·sql
CREATE TABLE posts (
    id         INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    title      TEXT NOT NULL,
    status     TEXT NOT NULL DEFAULT 'draft',
    views      INTEGER NOT NULL DEFAULT 0,
    slug       TEXT NOT NULL DEFAULT '',
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- title 만 필수; 나머진 자기 채움.
INSERT INTO posts (title) VALUES ('My First Post');
API 키 expression default·sql
CREATE TABLE api_keys (
    id      INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    secret  TEXT NOT NULL DEFAULT encode(gen_random_bytes(32), 'hex'),
    created TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 각 행이 64자 hex secret — 서버측 생성, 앱 free.
INSERT INTO api_keys (user_id) VALUES (1);
STORED + VIRTUAL generated column (PG 18)·sql
CREATE TABLE products (
    id         INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    price      NUMERIC(10,2) NOT NULL,
    tax_rate   NUMERIC(4,3) NOT NULL DEFAULT 0.10,
    -- STORED: write 시 계산, 영속; 인덱싱 가능.
    total      NUMERIC GENERATED ALWAYS AS (price * (1 + tax_rate)) STORED,
    -- VIRTUAL: read 시 계산, storage 0; PG 18+.
    margin_pct NUMERIC GENERATED ALWAYS AS ((price - 10) / NULLIF(price,0) * 100) VIRTUAL
);

External links

Exercise

제어 가능한 테이블에 STORED generated column 추가. 그 컬럼에 직접 INSERT/UPDATE 하면 명확한 에러로 실패하는지 확인. PG 18+ 면 VIRTUAL 도 추가 + storage 차이 관찰.

Progress

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

댓글 0

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

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