모든 테이블엔 rowid 가 있어 (거의)
기본값으로 모든 SQLite 테이블엔 보이지 않는 rowid 가 있어 — 엔진이 row 마다 부여하는 64-bit 정수. 이게 인덱스 / join 이 row 찾는 내부 메커니즘. 직접 볼 수 있어.
SELECT rowid, * FROM users;컬럼을 INTEGER PRIMARY KEY 로 선언하면 (정확히 그 표기, INT PRIMARY KEY 아님) SQLite 가 그 컬럼을 rowid 의 alias 로 만들어. 컬럼이 rowid 가 돼 — 추가 저장 X, 추가 인덱스 X, 그냥 SQLite 가 이미 관리하던 정수의 다른 이름.
다른 PK 모양:
- Composite PK — 여러 컬럼 위
PRIMARY KEY (a, b). - WITHOUT ROWID 테이블 — 정수 외 키 (예: UUID) 에 유용. 선언한 컬럼이 실제 storage key 가 됨.
Warning:
INT PRIMARY KEY ≠ INTEGER PRIMARY KEY. 첫 번째는 평범한 인덱싱된 컬럼, INTEGER 정확히 써야만 rowid-alias 최적화 활성. 쉽게 ship 되는 버그 — insert 는 되지만 큰 테이블에서 silently 성능 회귀.