- blogs:
- cles::blog
2013/09/15

sqlite と ROWID

SQLite を使っていて、主キーがないテーブルで一意にデータを識別する方法がないかと思っていろいろと調べてみました。
Oracle や PostgreSQL で言うところの rowid や oid にあたるものがあれば一撃だなと思ってマニュアルを当たってみたところ、SQLite にも同じようなものが用意されていました。参照するときの名前は rowid でも oid でもどちらでも良いみたいです。下記によると 64bit 長の符号付き整数として自動的に定義されるようですが、負数になるかどうかというのはちょっと謎です。
ROWIDs and the INTEGER PRIMARY KEY - SQLite Query Language: CREATE TABLE
Every row of every SQLite table has a 64-bit signed integer key that uniquely identifies the row within its table. This integer is usually called the "rowid". The rowid value can be accessed using one of the special case-independent names "rowid", "oid", or "_rowid_" in place of a column name. If a table contains a user defined column named "rowid", "oid" or "_rowid_", then that name always refers the explicitly declared column and cannot be used to retrieve the integer rowid value.
以下、動作確認メモ。
まず、簡単なテーブルを作って、データを入れておきます。
下記のような感じでわざと同じデータを2度挿入すると2つの行は一見区別できない状態になります。
sqlite> CREATE TABLE foo ( f1 VARCHAR(20), f2 VARCHAR(20) );
sqlite> insert into foo values( 'hoge', 'fuga' );
sqlite> insert into foo values( 'hoge', 'fuga' );
sqlite> SELECT * FROM foo;
f1 f2
---------- ----------
hoge fuga
hoge fuga
rowid を知るためには * ではダメで、明示的にカラム名を指定してやる必要があります。
これで、2つの行を区別することができるようになりました。また、rowid は WHERE の条件として使うこともできます。
sqlite> SELECT rowid,* FROM foo;
rowid f1 f2
---------- ---------- ----------
1 hoge fuga
2 hoge fuga
sqlite> SELECT rowid,* FROM foo WHERE rowid = 2;
rowid f1 f2
---------- ---------- ----------
2 hoge fuga
こういうパターンはあまりないかもしれませんが、最後に挿入された行を知るために Last Insert Rowid を使うときなんかにお世話になるかもしれません。
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6142
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112107)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110744)
3 . 年次の人間ドックへ(110348)
4 . 2023 年分の確定申告完了!(1つめ)(109902)
5 . 三菱鉛筆がラミーを買収(109801)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110744)
3 . 年次の人間ドックへ(110348)
4 . 2023 年分の確定申告完了!(1つめ)(109902)
5 . 三菱鉛筆がラミーを買収(109801)
cles::blogについて
Referrers