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)

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

select *, rowid from user;

ROWIDの値を取得(2)

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

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

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

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

ROWIDの値を取得(3)

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

select *, rowid from user where rowid = 2;

ROWIDの値を取得(4)

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

select *, rowid, oid, _rowid_ from user;

ROWIDの値を取得(5)

ROWIDに値を設定

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

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

ROWIDに値を設定(1)

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

select *, rowid from user;

ROWIDに値を設定(2)

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

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 と同じ値を参照します。 INTEGER PRIMARY KEY が設定されたカラムに値を指定すれば ROWID も同じ値となり、 ROWID に値を指定すれば INTEGER PRIMARY KEY が設定されたカラムも同じ値となります。(別々の値を指定してデータを追加した場合は、後から指定した値が両方に格納されます)。

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

create table user (userno 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 *, rowid from user;

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

ROWID を取得したはずですが取得したデータを見ると INTEGER PRIMARY KEY が設定されたカラム名でデータが表示されています。正確には分からないので推測になってしまいますが、INTEGER PRIMARY KEY が設定されたカラムがある場合には、ROWID としてそのカラムが使用されるのかもしれません。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。