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

AUTOINCREMENT vs 암묵적 Rowid

~12 min · schema, autoincrement, rowid

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

거의 항상: AUTOINCREMENT 쓰지 마

SQLite 에 AUTOINCREMENT 키워드는 있는데, semantic 이 사람들이 기대하는 것보다 미묘하고 default 동작보다 느려.

  • Default INTEGER PRIMARY KEY — SQLite 가 다음 사용 가능 rowid 를 고름. row 삭제하면 엔진이 그 id 재사용 가능.
  • INTEGER PRIMARY KEY AUTOINCREMENT — 보장 추가: id 가 monotonically increasing, 삭제 후에도 재사용 안 함. 내부 sqlite_sequence 테이블이 max-ever rowid 추적.

비용: insert 마다 sqlite_sequence 건드리니 page write 추가. 이득은 거의 필요 없음 — 대부분 앱 코드가 'DB 가 id 재사용 안 하는 거' 에 의존 안 해. 글로벌 unique id 필요하면 TEXT 컬럼에 UUID + WITHOUT ROWID.

Warning: 테이블에 AUTOINCREMENT commit 하면 CTAS dance 없이는 못 빠져나와. 진짜 no-reuse 보장 필요한지 미리 결정.

Code

Default vs AUTOINCREMENT — 차이 관찰·sql
-- Default: 삭제 후 id 재사용 가능
CREATE TABLE a(id INTEGER PRIMARY KEY, n TEXT);
INSERT INTO a(n) VALUES ('one'), ('two'), ('three');
DELETE FROM a WHERE id = 3;
INSERT INTO a(n) VALUES ('four');
SELECT * FROM a;
-- 1 | one
-- 2 | two
-- 3 | four    <- 재사용!

-- AUTOINCREMENT: 재사용 안 함
CREATE TABLE b(id INTEGER PRIMARY KEY AUTOINCREMENT, n TEXT);
INSERT INTO b(n) VALUES ('one'), ('two'), ('three');
DELETE FROM b WHERE id = 3;
INSERT INTO b(n) VALUES ('four');
SELECT * FROM b;
-- 1 | one
-- 2 | two
-- 4 | four    <- 3 건너뜀

External links

Exercise

위 demo 본인 머신에서 실행. 그 다음 한 페이지 노트 작성: no-reuse 보장이 어떤 앱 시나리오에서 중요? 어디선 그냥 overhead? 각각 실제 예시. 보너스: WITHOUT ROWID 로 같은 효과 내는 UUID-keyed 테이블 디자인.

Progress

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

댓글 0

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

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