概要
SQLite のテーブルの各レコードにはデフォルトで隠しカラムとしてrowidが設定される。
積極的に使うわけではないけど覚えておくと便利な機能、といった程度の認識でいい。
仕様を理解していないうちに頼ってしまうと後々痛い目に合うので注意。
このrowidには符号付64ビットのユニークな整数が自動的に格納される。
役割としてはprimary keyと同じで、テーブルのレコードを一意に識別するために使われる。
この記事ではprimary key や
autoincrement を設定していないシンプルなテーブルでの挙動について記載する。
実行例
環境
- Windows 11
- SQLite3 (3.53.1) Command-Line Shell
適当なテーブルを作成し、適当なデータを挿入し、rowidを確認してみる。
rowidに入っている値を調べるには、以下のいずれかのカラム名を指定してselect文を実行する。
rowidoid_rowid_
- アスタリスク(
*)ではrowidselect されない。 - 明示的に
rowidを指定すると select することができる。 -
rowid、oid、_rowid_はすべて同じ値を指し、 カラム名はrowidとして返される。
sqlite> create table user (id, name);
sqlite> insert into user (id, name) values (111, 'sample_user_1');
sqlite> insert into user (id, name) values (222, 'sample_user_2');
sqlite> .mode box
sqlite> -- 1.
sqlite> select * from user;
┌─────┬───────────────┐
│ id │ name │
├─────┼───────────────┤
│ 111 │ sample_user_1 │
│ 222 │ sample_user_2 │
└─────┴───────────────┘
sqlite> -- 2.
sqlite> select rowid, * from user;
┌───────┬─────┬───────────────┐
│ rowid │ id │ name │
├───────┼─────┼───────────────┤
│ 1 │ 111 │ sample_user_1 │
│ 2 │ 222 │ sample_user_2 │
└───────┴─────┴───────────────┘
sqlite> -- 3.
sqlite> select rowid, oid, _rowid_ from user;
┌───────┬───────┬───────┐
│ rowid │ rowid │ rowid │
├───────┼───────┼───────┤
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
└───────┴───────┴───────┘
要するに上記のSQLでは、実際には以下のようなテーブルが作成されていることになる。
|
rowid 別名:oid 別名:_rowid_ (隠しカラム) |
id | name |
|---|---|---|
| 1 | 111 | sample_user_1 |
| 2 | 222 | sample_user_2 |
そのテーブルの最大 rowid + 1 が採番される
例外はあるものの、基本的にはそのテーブルの最大 rowid + 1 が採番される。
そのため、rowid は連番であることが多い。
参考URL
-
ROWIDs and the INTEGER PRIMARY KEY(英語)
公式のROWIDに関するドキュメント
https://www.sqlite.org/lang_createtable.html#rowids_and_the_integer_primary_key -
Rowid Tables(英語)
Rowid が設定されたテーブルに関するドキュメント
https://sqlite.org/rowidtable.html