본문 바로가기
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+)

컬럼 타입은 못 바꾸고, 기존 컬럼에 제약을 더 얹지도 못하고, 컬럼 순서도 못 건드려. 그런 게 필요하면 정통 패턴은 CTAS dance야. 원하는 모양으로 새 테이블을 만들고, 데이터를 옮기고, 옛 테이블을 drop하고, 이름을 바꿔 다는 거지.

Warning: 상수가 아닌 default를 달고 ADD COLUMN을 하면 — 예를 들어 DEFAULT (random()) — 거부당해. default는 literal이거나 상수 표현식이어야 하거든. 우회로는 간단해. NULL default로 컬럼을 먼저 붙이고 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를 세 번 걸어봐. 컬럼 이름을 바꾸고, 선택적인 새 컬럼을 붙이고, 안 쓰는 컬럼을 떼어내. 그다음 CTAS dance로 컬럼 타입을 TEXT에서 INTEGER로 바꿔봐. row 수와 표본 몇 개를 전후로 비교해서 데이터가 살아남았는지 확인해.

Progress

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

댓글 0

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

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