거의 항상: AUTOINCREMENT 쓰지 마
SQLite에 AUTOINCREMENT 키워드가 있긴 한데, 사람들이 기대하는 것보다 semantic이 미묘하고 기본 동작보다 느려.
- 그냥 INTEGER PRIMARY KEY — SQLite가 쓸 수 있는 다음 rowid를 골라. row를 지우면 엔진이 그 id를 다시 쓸 수도 있어.
- INTEGER PRIMARY KEY AUTOINCREMENT — 여기에 보장이 하나 더 붙어. id가 항상 커지기만 하고, 지운 뒤에도 재사용하지 않아. 내부의
sqlite_sequence테이블이 지금까지 나온 최대 rowid를 기억해.
대가가 있어. insert할 때마다 sqlite_sequence를 건드리니까 page write가 하나씩 더 붙어. 그런데 얻는 건 대개 필요가 없어. 앱 코드가 'DB가 id를 재사용하지 않는다'에 기대는 경우는 드물거든. 전역에서 겹치지 않는 id가 정말 필요하면 TEXT 컬럼에 UUID를 담고 WITHOUT ROWID를 쓰는 게 나아.
Warning: 테이블에 AUTOINCREMENT를 한 번 박으면 CTAS dance 없이는 못 빼. 재사용 금지 보장이 정말 필요한지 미리 결정해.