본문 바로가기
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(a, b)처럼 묶어서 걸 수도 있어.
  • CHECK (expr) — 컬럼 위에 아무 boolean 표현식이나 걸 수 있어. 결과가 false면 insert나 update가 실패해.
  • FOREIGN KEY — 다른 테이블의 키를 참조해. 다음 트랙에서 제대로 다뤄.
Principle: 제약은 실행되는 문서야. NOT NULL과 CHECK가 박힌 schema는 다음에 이 테이블을 읽는 사람한테 — 피파든 너든 팀원이든 — 이 테이블이 어떤 약속을 지키고 있는지 알려줘. 주석은 썩지만 제약은 시끄럽게 실패하거든.

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 테이블에 제약을 최소 네 개 걸어봐. FK와 content에 NOT NULL, role이 정해진 값 안에 있는지 보는 CHECK, content 길이가 0보다 큰지 보는 CHECK, created_at에 DEFAULT. 각 제약을 어기는 insert를 하나씩 던져보고 에러를 관찰해. 그러고 나서 스스로에게 물어봐. 이 중 어떤 게 schema에 있는 게 낫고, 어떤 게 앱에 있는 게 나을까?

Progress

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

댓글 0

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

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