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

ALTER TABLE — 가능한 거, 불가능한 거

~12 min · schema, alter-table, migrations

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

의도적으로 반쪽 짜리 — 조심해서 사용

SQLite 의 ALTER TABLE 은 Postgres 보다 의도적으로 제한적. 지원 연산:

  • ALTER TABLE t RENAME TO new_name
  • ALTER TABLE t RENAME COLUMN old_name TO new_name (3.25+)
  • ALTER TABLE t ADD COLUMN c TYPE [constraints]
  • ALTER TABLE t DROP COLUMN c (3.35+)

끝이야. 컬럼 타입 변경 X, 기존 컬럼에 제약 추가 X, 컬럼 reorder X. 그런 거 하려면 정통 패턴이 CTAS dance: 새 모양 테이블 만들고, 데이터 복사, 옛 거 drop, rename.

Warning: Non-constant default expression 으로 ADD COLUMN (예: DEFAULT (random())) 은 거부됨. Default 는 literal 또는 constant 표현식이어야 함. 우회: NULL default 로 ADD 후 UPDATE 로 채움.

Code

그냥 되는 단순 ALTER·sql
ALTER TABLE conversations RENAME COLUMN title TO display_title;
ALTER TABLE conversations ADD COLUMN pinned INTEGER NOT NULL DEFAULT 0;
ALTER TABLE conversations DROP COLUMN deprecated_field;
CTAS dance — 안전하게 컬럼 타입 변경·sql
BEGIN;

CREATE TABLE conversations_new (
  id          INTEGER PRIMARY KEY,
  display_title TEXT NOT NULL,
  brain         TEXT NOT NULL DEFAULT 'claude',
  pinned        INTEGER NOT NULL DEFAULT 0,
  created_at    INTEGER NOT NULL,            -- 변경: TEXT -> INTEGER (epoch)
  updated_at    INTEGER NOT NULL
) STRICT;

INSERT INTO conversations_new
SELECT id, display_title, brain, pinned,
       unixepoch(created_at), unixepoch(updated_at)
FROM   conversations;

DROP TABLE conversations;
ALTER TABLE conversations_new RENAME TO conversations;

COMMIT;

External links

Exercise

messages 테이블에 ALTER 3 개 실행: 컬럼 rename, optional 새 컬럼 add, 안 쓰는 거 drop. 그 다음 CTAS dance 로 컬럼 타입 TEXT -> INTEGER 변경. Row count + sample 비교로 데이터 살아남았는지 확인.

Progress

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

댓글 0

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

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