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

STRICT 테이블 (3.37+)

~12 min · schema, strict, types

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

Opt-in 진짜 타이핑

SQLite 3.37 (2021 년 11 월) 에서 STRICT 테이블 도입. CREATE TABLE 끝에 STRICT 붙이면 SQLite 가 선언된 타입과 안 맞는 insert 거부. 2026 년에 새 schema 시작하면 이게 default 야.

STRICT 모드는 5 가지 타입만 허용: INTEGER, REAL, TEXT, BLOB, ANY. VARCHAR(255) 같은 느슨한 affinity 이름은 테이블 생성 시점에 거부 — STRICT 가 정직하게 만들어.

Tip: 2026 년에 새 schema 시작하면 모든 테이블 STRICT 기본. dynamic-typing '기능' 은 2000 년대 초 embedded-C 시대의 의도된 타협이었음. 모던 앱 코드는 DB 가 계약을 지켜주길 원해.

한 가지 quirk: STRICT 테이블은 모든 컬럼 타입이 strict 5 개 중 하나여야 함. 기존 schema 마이그레이션은 VARCHAR, NUMERIC 등을 strict set 으로 다시 써야 함. ANY 는 '진짜 polymorphic 컬럼 원함' 케이스용 — 예: key-value 테이블의 value 컬럼.

Code

STRICT 실제·sql
CREATE TABLE notes (
  id   INTEGER PRIMARY KEY,
  body TEXT NOT NULL,
  tags TEXT,                -- JSON array, SQL 입장에선 opaque
  created_at TEXT NOT NULL DEFAULT (datetime('now'))
) STRICT;

INSERT INTO notes(body) VALUES (42);
-- Error: cannot store INTEGER value in TEXT column body

INSERT INTO notes(body) VALUES ('hello');
-- OK
Polymorphic 컬럼용 STRICT + ANY·sql
CREATE TABLE settings (
  k TEXT PRIMARY KEY,
  v ANY
) STRICT;

INSERT INTO settings(k, v) VALUES ('theme', 'dark');
INSERT INTO settings(k, v) VALUES ('font_size', 14);
INSERT INTO settings(k, v) VALUES ('debug', 1);

SELECT k, v, typeof(v) FROM settings;
-- theme    | dark | text
-- font_size| 14   | integer
-- debug    | 1    | integer

External links

Exercise

s01 의 messages 테이블을 STRICT 로 다시 작성. 본인 머신의 SQLite 가 3.37+ 인지 확인. Insert 3 번 시도: 유효한 거, 잘못된 타입, NOT NULL 인 자리에 NULL. SQLite 가 잘못된 거 명확한 에러로 거부하는지 확인.

Progress

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

댓글 0

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

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