SQLiteを学んでいこうという連載の15回目です。前回の記事はこちらになります。
前回は、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は値が同じになります。次回はビューです。テーブルから取り出したデータをテーブルとして使う機能らしいのですが、いったいどう使うのでしょうか?お楽しみに!!