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');
取得したデータのカラム名が表示されるように .headers on を事前に実行しておきます。
.headers on
テーブルから select * from user; のようにデータを取得しても ROWID の値は表示されませんが、 ROWID を明示的に指定してデータを取得すると通常のカラムと同じようにデータを取得することができます。
select id, name, rowid from user;
このように ROWID の値がデータ毎に保存されていることが確認できます。
データを新しく追加した時、既に格納されているデータの中で ROWID の値が最大のものを探し、それに 1 を加えた値が新しく追加されるデータの ROWID の値として保存されます。
現在格納されてるデータの中で ROWID の値が一番大きい値は 2 なので、次にデータを追加するとそのデータの ROWID の値は 3 となります。ではデータを追加してみます。
insert into user values(5, 'Itou');
テーブルからデータを再度取得してみると、最後に追加したデータの ROWID の値が 3 になっているのか確認できます。
select id, name, rowid from user;
ROWID は WHERE 句の条件式で使用することもできます。
select id, name, 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 id, name, rowid from user;
注意点として ROWID は重複した値を持つことはできません。既に他のデータで設定されている値を ROWID に設定しようとすると Runtime error: UNIQUE constraint failed: user.rowid というエラーが表示されます。
既にテーブルには ROWID の値が 3 のデータが追加されていますが、新しいデータとして ROWID に 3 を設定してデータを追加してみます。
insert into user(id, name, ROWID) values(9, 'Uchida', 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 も含めてデータを取得します。
select id, name, rowid from user;
ID カラムの値と ROWID カラムの値が同じです。ただ取得したデータのカラム名を見て頂くと分かりますが、 ROWID ではなく名前が ID になっています。
INTEGER PRIMARY KEY が設定されたカラムがテーブルにある場合は、 ROWID の値を取得すると、 INTEGER PRIMARY KEY が設定されたカラムの値を返します。
-- --
SQLite における ROWID の利用方法と INTEGER PRIMARY KEY との関係について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。