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

제약: NOT NULL, DEFAULT, UNIQUE, CHECK

~14 min · schema, constraints, data-integrity

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

검증을 DB 안으로 밀어넣어

SQLite 는 다른 관계형 DB 에서 기대하는 컬럼 단위 제약을 지원해. 써. Schema 의 제약은 어떤 언어가 코드를 짰든 모든 insert/update 에서 돌아 — 그게 원하는 거잖아.

  • NOT NULL — NULL 안 됨.
  • DEFAULT expr — insert 가 컬럼 생략하면 쓰는 값.
  • UNIQUE — row 들 사이에서 unique. 컬럼 단위 또는 테이블 단위 (UNIQUE(a, b)).
  • CHECK (expr) — 컬럼(들) 위 임의 boolean 표현식. false 면 insert/update 실패.
  • FOREIGN KEY (다음 트랙) — 다른 테이블의 키 참조.
Principle: 제약은 실행되는 문서야. NOT NULL + CHECK 가 있는 schema 는 다음 reader (피파, 너, 팀원) 한테 그 테이블이 어떤 invariant 를 유지하는지 알려줘. 주석은 썩지만 제약은 시끄럽게 실패해.

Code

4 가지 제약 한 테이블에·sql
CREATE TABLE users (
  id         INTEGER PRIMARY KEY,
  email      TEXT    NOT NULL UNIQUE,
  username   TEXT    NOT NULL UNIQUE
               CHECK (length(username) BETWEEN 3 AND 32),
  age        INTEGER CHECK (age IS NULL OR age >= 13),
  role       TEXT    NOT NULL DEFAULT 'member'
               CHECK (role IN ('member', 'admin', 'moderator')),
  created_at TEXT    NOT NULL DEFAULT (datetime('now'))
) STRICT;
제약이 발동하는 거 보기·sql
INSERT INTO users(email, username) VALUES ('a@x.com', 'al');
-- Error: CHECK constraint failed (username length)

INSERT INTO users(email, username, role) VALUES ('a@x.com', 'alice', 'god');
-- Error: CHECK constraint failed (role)

INSERT INTO users(email, username) VALUES ('a@x.com', 'alice');
-- OK

INSERT INTO users(email, username) VALUES ('a@x.com', 'bob');
-- Error: UNIQUE constraint failed: users.email

External links

Exercise

messages 테이블에 제약 최소 4 개 추가: FK 와 content 에 NOT NULL, role 이 고정 set 안인지 CHECK, content 길이 > 0 CHECK, created_at DEFAULT. 각 제약 위반 insert 시도하고 에러 관찰. 그리고 질문: 어느 게 'schema 에 두는 게 낫다' vs '앱에 두는 게 낫다' 인지.

Progress

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

댓글 0

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

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