ROWIDの参照とINTEGER PRIMARY KEYとの関係

SQLite でデータを追加すると、データ毎に ROWID と呼ばれる値が自動的に割り当てられ他のカラムの値と同じようにデータとして格納されます。ここでは SQLite における ROWID の利用方法と INTEGER PRIMARY KEY との関係について解説します。

(Last modified: )

ROWIDの値を取得

ROWID とはテーブルに用意されている非表示のカラムです。テーブルにデータを追加するごとに自動的に ROWID にも値が設定されます。

テスト用に次のようなテーブルを作成し、データを2つ追加しました。

create table user (id integer, name text);

insert into user values(3, 'Yamada');
insert into user values(8, 'Suzuki');

ROWIDの値を取得(1)

取得したデータのカラム名が表示されるように .headers on を事前に実行しておきます。

.headers on

ROWIDの値を取得(2)

テーブルから select * from user; のようにデータを取得しても ROWID の値は表示されませんが、 ROWID を明示的に指定してデータを取得すると通常のカラムと同じようにデータを取得することができます。

select id, name, rowid from user;

ROWIDの値を取得(3)

このように ROWID の値がデータ毎に保存されていることが確認できます。

データを新しく追加した時、既に格納されているデータの中で ROWID の値が最大のものを探し、それに 1 を加えた値が新しく追加されるデータの ROWID の値として保存されます。

現在格納されてるデータの中で ROWID の値が一番大きい値は 2 なので、次にデータを追加するとそのデータの ROWID の値は 3 となります。ではデータを追加してみます。

insert into user values(5, 'Itou');

ROWIDの値を取得(4)

テーブルからデータを再度取得してみると、最後に追加したデータの ROWID の値が 3 になっているのか確認できます。

select id, name, rowid from user;

ROWIDの値を取得(5)

ROWID は WHERE 句の条件式で使用することもできます。

select id, name, rowid from user where rowid = 2;

ROWIDの値を取得(6)

なお ROWID は他のデータベースとの互換性を保つために別名として OID と _ROWID_ が用意されています。どれを使用しても ROWID の値を返しますので、例えば ROWID の代わりに _ROWID_ を使用されても構いません。

select rowid, oid, _rowid_ from user;

ROWIDの値を取得(7)

すべて同じ値を取得できることが確認できます。

ROWIDに値を設定

ROWID の値はデータの追加時に自動的に設定されるので通常は気にしなくてもいいのですが、任意の値を指定することもできます。先程作成したテーブルに次のように新しいデータを追加してみます。

insert into user(id, name, ROWID) values(10, 'Hanayama', 8);

ROWIDに値を設定(1)

データを取得してみると、最後に追加したデータについて指定した値が ROWID に格納されていることが確認できます。

select id, name, rowid from user;

ROWIDに値を設定(2)

注意点として ROWID は重複した値を持つことはできません。既に他のデータで設定されている値を ROWID に設定しようとすると Runtime error: UNIQUE constraint failed: user.rowid というエラーが表示されます。

既にテーブルには ROWID の値が 3 のデータが追加されていますが、新しいデータとして ROWID に 3 を設定してデータを追加してみます。

insert into user(id, name, ROWID) values(9, 'Uchida', 3);

ROWIDに値を設定(3)

エラーが表示されてデータの追加が失敗しました。

ROWIDの参照とINTEGER PRIMARY KEYとの関係

ここまでの ROWID の特徴を見て頂くと分かると思いますが、 ROWID はデータ型を INTEGERでPRIMARY KEY 制約が設定されているカラムとまったく同じ挙動を示します。

実はテーブルの中に INTEGER PRIMARY KEY が設定されたカラムがある場合、そのカラムは ROWID のエイリアスとして機能し、常に同じ値を参照します。

テスト用に次のようなテーブルを作成し、データを 3 つ追加しました。

create table user (id integer primary key, name text);

insert into user values(1, 'Yamada');
insert into user values(6, 'Suzuki');
insert into user values(3, 'Honda');

ROWIDの参照とINTEGER PRIMARY KEYとの関係(1)

テーブルから ROWID も含めてデータを取得します。

select id, name, rowid from user;

ROWIDの参照とINTEGER PRIMARY KEYとの関係(2)

ID カラムの値と ROWID カラムの値が同じです。ただ取得したデータのカラム名を見て頂くと分かりますが、 ROWID ではなく名前が ID になっています。

ROWIDの参照とINTEGER PRIMARY KEYとの関係(3)

INTEGER PRIMARY KEY が設定されたカラムがテーブルにある場合は、 ROWID の値を取得すると、 INTEGER PRIMARY KEY が設定されたカラムの値を返します。

-- --

SQLite における ROWID の利用方法と INTEGER PRIMARY KEY との関係について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。