ROWIDの利用
SQLiteでデータを追加すると、データ毎にROWIDと呼ばれる値が自動的に割り当てられ他のカラムの値と同じようにデータとして格納されます。ここではROWIDの利用方法とINTEGER PRIMARY KEYとの関係について解説します。
1.ROWIDの値を取得
2.ROWIDに値を設定
次のようなテーブルを作成し実際に試してみます。データを2つ追加しました。
テーブルから普通にデータを取得しても表示されませんが、ROWIDを明示的に指定してデータを取得すると通常のカラムと同じようにデータを取得することができます。
select *, ROWID from user;
このようにROWIDの値がデータ毎に保存されていることが確認できます。
データを新しく追加した時、既に格納されているデータの中でROWIDの値が最大のものを探し、それに1を加えた値が新しく追加されるデータのROWIDの値として保存されます。
例えば現在格納されてるデータの中でROWIDの値が一番大きい値は「2」ですので、次にデータを追加するとそのデータのROWIDの値は「2」に1を加えた「3」となります。
ROWIDはWHERE句の条件式で使用することもできます。
select *, ROWID from user where ROWID = 2;
なおROWIDは他のデータベースとの互換性を保つために別名としてOIDと_ROWID_が用意されています。どれを使用してもROWIDの値を返しますので、例えばROWIDの代わりに_ROWID_を使用されても構いません。
ROWIDの値はデータの追加時に自動的に設定されるので通常は気にしなくてもいいのですが、任意の値を指定することもできます。
insert into user(id, name, ROWID) values(5, 'Endo', 7);
データを取得してみると、指定した値がROWIDに格納されていることが確認できます。
注意点としてROWIDは重複した値を持つことはできません。既に他のデータで設定されている値をROWIDに設定しようとすると「Error: UNIQUE constraint failed: user.rowid」というエラーが表示されます。
ここまでのROWIDの特徴を見て頂くと分かると思いますが、ROWIDはデータ型をINTEGERでPRIMARY KEY制約が設定されているカラムとまったく同じ挙動を示します。
実はカラムにINTEGER PRIMARY KEYを設定すると、そのカラムはROWIDと同じ値を参照します。INTEGER PRIMARY KEYが設定されたカラムに値を指定すればROWIDも同じ値となり、ROWIDに値を指定すればINTEGER PRIMARY KEYが設定されたカラムも同じ値となります。(別々の値を指定してデータを追加した場合は、後から指定した値が両方に格納されます)。
( Written by Tatsuo Ikura )