ROWID(SQLiteを学ぶ_15)

SQLiteを学んでいこうという連載の15回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、SQLiteのPRIMARY KEY制約の働きについてご紹介しました。

今回はSQLiteのROWID機能についてご紹介します。

ROWIDとは

SQLiteはテーブルに追加したレコードにそれぞれ個別の番号を振っています。これをROWIDと呼びます。ROWIDはテーブルにレコードを追加する際に自動的に付与されます。 ROWIDを確認してみましょう。以下の手順でテーブルを作成してみました。

sqlite> CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER);
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(2,"YAMADA",30);
sqlite> INSERT INTO sample VALUES(3,"OOTA",27);

このテーブルに付与されるROWIDを確認してみましょう。

sqlite> SELECT *,ROWID FROM sample;
┌────┬──────────┬─────┬───────┐
│ id │   name   │ age │ rowid │
├────┼──────────┼─────┼───────┤
│ 1  │ 'TANAKA' │ 25  │ 1     │
│ 2  │ 'YAMADA' │ 30  │ 2     │
│ 3  │ 'OOTA'   │ 27  │ 3     │
└────┴──────────┴─────┴───────┘

列「rowid」が表示され、1から順番に番号が振られました。の様に列の指定で「ROWID」と記述することでROWIDを参照できます。ROWIDは条件を指定する際にも使用できます。ROWIDを指定してみまょう。

sqlite> SELECT * FROM sample WHERE ROWID = 2;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 2  │ 'YAMADA' │ 30  │
└────┴──────────┴─────┘

ROWIDで指定したレコードを選択できました。ROWIDは値を指定することもできます。でも、レコードを識別するためのデータですので重複しデータを指定することはできません。

sqlite> INSERT INTO sample(id,name,age,ROWID) values(4,'ITO',22,3);
Runtime error: UNIQUE constraint failed: sample.rowid (19)
sqlite> INSERT INTO sample(id,name,age,ROWID) values(4,'ITO',22,5);
sqlite> SELECT *,ROWID FROM sample;
┌────┬──────────┬─────┬───────┐
│ id │   name   │ age │ rowid │
├────┼──────────┼─────┼───────┤
│ 1  │ 'TANAKA' │ 25  │ 1     │
│ 2  │ 'YAMADA' │ 30  │ 2     │
│ 3  │ 'OOTA'   │ 27  │ 3     │
│ 4  │ 'ITO'    │ 22  │ 5     │
└────┴──────────┴─────┴───────┘

ROWIDにすでに使用されている値を指定するとエラーになりました。使用されていない値「5」を指定すると登録できました。

ROWIDとINTEGER型のPRIMARY KEY制約

ここまで来てみると、ROWIDは前回ご紹介したINTEGER型のPRIMARY KEY制約と似ていますよね。 実際にINTEGER型のPRIMARY KEY制約を設定したテーブルでROWIDの挙動を見てみましょう。以下を実行してみます。

sqlite> CREATE TABLE sample(id INTEGER PRIMARY KEY,name TEXT,age INTEGER);
sqlite> INSERT INTO sample VALUES(null,"MURAYAMA",22);
sqlite> INSERT INTO sample VALUES(3,"TANAKA",29);
sqlite> INSERT INTO sample VALUES(null,"YAMADA",26);
sqlite> INSERT INTO sample(id,name,age,ROWID) values(null,'ITO',22,7);
sqlite> SELECT *,ROWID FROM sample;
┌────┬────────────┬─────┬────┐
│ id │    name    │ age │ id │
├────┼────────────┼─────┼────┤
│ 1  │ 'MURAYAMA' │ 22  │ 1  │
│ 3  │ 'TANAKA'   │ 29  │ 3  │
│ 4  │ 'YAMADA'   │ 26  │ 4  │
│ 7  │ 'ITO'      │ 22  │ 7  │
└────┴────────────┴─────┴────┘

id(INTEGER型のPRIMARY KEY)とROWIDは同じ値になりました。idを指定しないとROWIDと同じ値なり、逆にROWIDを指定しないとidと同じ値になりました。って言うか、ROWIDの列名が「id」になっています。INTEGER型のPRIMARY KEY制約を設定すると、ROWIDを参照(?)することになるんですね。

次回はビュー

いかがでしょうか。SQLiteはROWIDでレコードを識別しているんですね。INTEGER型のPRIMARY KEYを指定した場合はROWIDは値が同じになります。次回はビューです。テーブルから取り出したデータをテーブルとして使う機能らしいのですが、いったいどう使うのでしょうか?お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから