본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

기본값과 생성 열

~14 min · schema, defaults

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

값을 빠뜨렸을 때 데이터베이스가 채운다

기본값은 INSERT에서 해당 열을 생략했을 때 적용돼. 명시적으로 NULL을 넣은 경우까지 대신 채우지는 않아. 모든 클라이언트가 각자 같은 값을 만들게 하지 않고 데이터베이스 한 곳에 규칙을 두는 장점이 있어.

고정값, 표현식, 생성값

  • 고정 기본값에는 0, 'draft', FALSE처럼 그대로 저장할 값을 둬.
  • 표현식 기본값에는 now(), CURRENT_DATE, gen_random_uuid()처럼 행을 넣는 순간 계산할 값을 둬.
  • API 키처럼 32바이트 난수가 필요하면 encode(gen_random_bytes(32),'hex') 같은 표현식도 쓸 수 있어.

생성 열은 다른 열에서 답을 얻어

생성 열은 같은 행의 값으로 계산되며 직접 INSERT하거나 UPDATE할 수 없어. PostgreSQL이 언제나 공식을 지키므로 전체 이름, 세금 포함 금액, 검색 벡터 같은 파생값에 알맞아. 디스크에 저장하는 STORED 방식이 있고 PG 18부터는 읽을 때 계산하는 VIRTUAL 방식도 있어. PG 18의 기능 차이를 확인한 뒤 색인이 필요하면 STORED를 써.

Code

고정값과 표현식 기본값·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 키 표현식 기본값·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 생성 열 (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 생성 열을 추가해. 그 열에 직접 INSERT와 UPDATE를 시도했을 때 명확한 오류가 나는지 확인해. PG 18 이상이라면 VIRTUAL 생성 열도 추가해 저장 공간의 차이를 관찰해.

Progress

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

댓글 0

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

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