SQLite | テーブル | ROWIDとINTEGER PRIMARY KEY

SQLiteは各行に隠し列ROWIDを自動で割り当てる。

create table user (id integer, name text);
insert into user values (3, 'devkuma');
insert into user values (8, 'araikuma');
select *, rowid from user;

最初の2行のROWIDは1と2になる。新しい行には通常、現在の最大値に1を加えた値が割り当てられる。

insert into user values (5, 'kimkc');
select *, rowid from user where rowid = 2;
select *, rowid, oid, _rowid_ from user;

OID_ROWID_ROWIDの別名である。

ROWIDの明示指定

insert into user (id, name, ROWID) values (10, 'happykuma', 8);
insert into user (id, name, ROWID) values (9, 'mykuma', 3);
-- UNIQUE constraint failed: user.rowid

ROWIDは一意でなければならない。

INTEGER PRIMARY KEYとの関係

INTEGER PRIMARY KEY列はROWIDの別名であり、一方を設定すると他方も同じ値になる。

create table user (id integer primary key, name text);
insert into user values (1, 'devkuma');
insert into user values (6, 'kimkc');
insert into user values (3, 'ariakuma');
select *, rowid from user;

結果のROWIDが列名idで表示されるのは、idがその別名だからである。