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

CREATE TABLE 기본

~14 min · schema, create-table, ddl

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

모든 테이블이 출발하는 자리

SQLite DB는 결국 테이블의 모음이고, 테이블은 전부 CREATE TABLE로 태어나. 모양은 단순해.

CREATE TABLE table_name (
  column_name TYPE [constraints],
  ...
);

SQLite도 제대로 된 schema를 주는데, 한 가지 비틀림이 있어. 기본값이 type affinity거든. TYPE이 힌트로서 의미는 갖지만, 다음 lesson에서 볼 STRICT 모드를 명시하지 않으면 엔진은 어떤 타입의 값이든 받아줘. 일단은 관습을 따라. 의도한 타입을 선언하고, 그걸 코드와 함께 지켜야 할 계약처럼 대해.

실제로 95%를 차지하는 타입은 다섯 개야.

  • INTEGER — 부호 있는 8바이트 정수.
  • REAL — IEEE 754 double.
  • TEXT — UTF-8 문자열.
  • BLOB — 손대지 않은 raw bytes.
  • NUMERIC — 정수를 선호하면서 소수도 받는 affinity인데, 애매해서 잘 안 써.
Principle: SQLite가 기본적으로 타입에 헐렁하더라도, CREATE TABLE은 엄격한 것처럼 써. 미래의 너도, 미래의 피파도, 미래의 독자도 고마워할 거야. 의도는 schema에 적어. 쓰는 쪽 코드에 적지 말고.

Code

진짜 쓸만한 CREATE TABLE·sql
CREATE TABLE conversations (
  id          INTEGER PRIMARY KEY,
  title       TEXT NOT NULL,
  brain       TEXT NOT NULL DEFAULT 'claude',
  created_at  TEXT NOT NULL DEFAULT (datetime('now')),
  updated_at  TEXT NOT NULL DEFAULT (datetime('now')),
  archived    INTEGER NOT NULL DEFAULT 0   -- 0/1 boolean
);
내가 만든 거 다시 읽기·sql
-- 자기 schema 읽는 두 가지
.schema conversations

SELECT name, sql FROM sqlite_schema WHERE type='table' AND name='conversations';

-- Per-column 메타 (PK, NOT NULL flag 포함)
SELECT cid, name, type, "notnull", dflt_value, pk
FROM   pragma_table_info('conversations');

External links

Exercise

conversations와 짝이 될 messages 테이블을 디자인해봐. id, conversations로 걸리는 FK, role('user'|'assistant'|'system'), content, created_at, 그리고 선택적으로 brain까지. CREATE TABLE을 직접 쓰고 pragma_table_info로 컬럼이 전부 의도대로 잡혔는지 확인해.

Progress

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

댓글 0

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

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