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

UNIQUE, CHECK, EXCLUDE 제약

~14 min · schema, constraints

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

DB 가 마지막 방어선

제약은 비즈니스 룰을 DB 자체에 박음. 앱 검증은 도움되지만 옵셔널 — 누구든 직접 SQL 연결이나 버그 코드 경로로 우회 가능. 제약은 보장. 밀어넣은 모든 룰이 50 군데서 검증 안 해도 되는 룰.

UNIQUE — 중복 없음

단일/다중 컬럼. 다중 컬럼 UNIQUE 가 '한 유저가 한 product 에 최대 한 review' 의 정답.

CHECK — 임의 boolean 룰

행 단위로 평가 가능한 모든 predicate: 양수 가격, 유효한 status, 합리적 percentage, 길이 제한. CHECK 는 같은 행의 다른 컬럼 참조 가능, 다른 행은 불가.

EXCLUDE — 겹침 방지

가장 강력하고 가장 덜 알려진 제약. EXCLUDE 가 선택한 연산자 하에 기존 행과 충돌 할 값의 행 거절. 클래식 케이스: 같은 방의 두 예약이 시간 겹치는 거 방지.

Code

UNIQUE — 단일 + 다중 컬럼·sql
CREATE TABLE users (
    id       INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    email    TEXT UNIQUE NOT NULL,
    username TEXT UNIQUE NOT NULL
);

CREATE TABLE reviews (
    id         INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    user_id    INTEGER NOT NULL REFERENCES users(id),
    product_id INTEGER NOT NULL REFERENCES products(id),
    rating     INTEGER NOT NULL CHECK (rating BETWEEN 1 AND 5),
    body       TEXT,
    UNIQUE (user_id, product_id)  -- 유저당 product 당 1 review
);
CHECK — 비즈니스 룰을 스키마에·sql
CREATE TABLE orders (
    id       INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    quantity INTEGER NOT NULL CHECK (quantity > 0),
    price    NUMERIC(10,2) NOT NULL CHECK (price >= 0),
    status   TEXT NOT NULL CHECK (status IN ('pending','paid','shipped','refunded')),
    discount NUMERIC(4,3) NOT NULL DEFAULT 0
                CHECK (discount BETWEEN 0 AND 1)
);
EXCLUDE — 방 예약 겹침 없음·sql
CREATE EXTENSION IF NOT EXISTS btree_gist;

CREATE TABLE room_bookings (
    id     INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    room   TEXT NOT NULL,
    during TSRANGE NOT NULL,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);

INSERT INTO room_bookings (room, during) VALUES
  ('A1', '[2026-05-10 10:00, 2026-05-10 11:00)');
INSERT INTO room_bookings (room, during) VALUES
  ('A1', '[2026-05-10 10:30, 2026-05-10 12:00)');
-- ERROR: conflicting key value violates exclusion constraint

External links

Exercise

갖고 있는 스키마에 현재 앱에만 사는 비즈니스 룰을 코드화하는 CHECK 제약 최소 1 개 추가. 동료 통과 — 대화 자체가 가치.

Progress

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

댓글 0

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

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