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');
テーブルから select * from user; のようにデータを取得しても ROWID の値は表示されませんが、 ROWID を明示的に指定してデータを取得すると通常のカラムと同じようにデータを取得することができます。
select *, rowid from user;
このように ROWID の値がデータ毎に保存されていることが確認できます。
データを新しく追加した時、既に格納されているデータの中で ROWID の値が最大のものを探し、それに1を加えた値が新しく追加されるデータの ROWID の値として保存されます。
現在格納されてるデータの中で ROWID の値が一番大きい値は 2 なので、次にデータを追加するとそのデータの ROWID の値は 3 となります。
insert into user values(5, 'Itou');
ROWID は WHERE 句の条件式で使用することもできます。
select *, rowid from user where rowid = 2;
なお ROWID は他のデータベースとの互換性を保つために別名として OID と _ROWID_ が用意されています。どれを使用しても ROWID の値を返しますので、例えば ROWID の代わりに _ROWID_ を使用されても構いません。
select *, rowid, oid, _rowid_ from user;
ROWIDに値を設定
ROWID の値はデータの追加時に自動的に設定されるので通常は気にしなくてもいいのですが、任意の値を指定することもできます。先程作成したテーブルに次のように新しいデータを追加してみます。
insert into user(id, name, ROWID) values(10, 'Hanayama', 8);
データを取得してみると、指定した値が ROWID に格納されていることが確認できます。
select *, rowid from user;
注意点として ROWID は重複した値を持つことはできません。既に他のデータで設定されている値を ROWID に設定しようとすると Error: UNIQUE constraint failed: user.rowid というエラーが表示されます。
insert into user(id, name, ROWID) values(9, 'Uchida', 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 も含めてデータを取得します。
select *, rowid from user;
ROWID を取得したはずですが取得したデータを見ると INTEGER PRIMARY KEY が設定されたカラム名でデータが表示されています。正確には分からないので推測になってしまいますが、INTEGER PRIMARY KEY が設定されたカラムがある場合には、ROWID としてそのカラムが使用されるのかもしれません。
( Written by Tatsuo Ikura )

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