ラベル rowid の投稿を表示しています。 すべての投稿を表示
ラベル rowid の投稿を表示しています。 すべての投稿を表示

2026年7月10日金曜日

SQLite3 rowid を理解する

概要

SQLite のテーブルの各レコードにはデフォルトで隠しカラムとしてrowidが設定される。
積極的に使うわけではないけど覚えておくと便利な機能、といった程度の認識でいい。
仕様を理解していないうちに頼ってしまうと後々痛い目に合うので注意。

このrowidには符号付64ビットのユニークな整数が自動的に格納される。
役割としてはprimary keyと同じで、テーブルのレコードを一意に識別するために使われる。

この記事ではprimary keyautoincrement を設定していないシンプルなテーブルでの挙動について記載する。

実行例

環境
  • Windows 11
  • SQLite3 (3.53.1) Command-Line Shell

適当なテーブルを作成し、適当なデータを挿入し、rowidを確認してみる。

rowidに入っている値を調べるには、以下のいずれかのカラム名を指定してselect文を実行する。

  • rowid
  • oid
  • _rowid_

  1. アスタリスク(*)では rowidselect されない。
  2. 明示的にrowidを指定すると select することができる。
  3. rowidoid_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