« 穂高・安曇野ぶらりポタリング | 記事一覧へ | サイクリングヤマト便(復路) »

2007年08月22日

●【PostgreSQL】 OIDとSERIAL

[あとで読む]

postgres.jpg


OIDについて

OracleのROWIDのように使える、PostgreSQLのレコードの識別子、OID。

例1) TABLE1をCOL1でグループ化し、各グループ内で最初に登録されたレコードを抽出
select COL1, COL2, min(oid) from TABLE1 group by COL1;

例2) OIDでソートして最初の3件※のレコードを取得
select oid, * from TABLE1 order by oid limit 3

  ※limitとoffset(件数指定) http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/psql_k09.htm


ただし、現在ではOIDの使用は推奨されないようである。

default_with_oidsのデフォルトがfalseになりました。

このオプションをfalseに設定した場合、CREATE TABLEでWITH OIDSを指定しない限り、ユーザが作成したテーブルはOID列を持たなくなります。すべてのPostgreSQLリリースでOIDは存在していましたが、4バイト長しかなく、インストールされたデータベース全体で共有アクセスされていることから、OIDの利用は制限されてきました。一意に行を識別するには、シーケンスまたはSERIAL型を使用することを勧めます。これはPostgreSQL 6.4からサポートされています。

http://www.sraoss.co.jp/PostgreSQL/8.1/changes.html

SERIAL型について

OIDより推奨される識別用のデータ型「SERIAL型」。
http://www.postgresql.jp/document/pg803doc/html/datatype.html

serial 型は、Postgres が既に在るコンポーネントの組み合わせで作る特別なデータ型で、一般的にはテーブルの項目に一意な識別子(id)を作るため使われます。現在の実装では serial 型を使用する時に、

CREATE TABLE tablename
(colname SERIAL);

と指定するのは、以下と同等です:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename
(colname INT4 DEFAULT nextval('tablename_colname_seq');
CREATE UNIQUE INDEX tablename_colname_key on tablename (colname);


!!! Caution !!!

serial 型を含んでいるテーブルが削除されても、 serial 型のために作られた暗示的なシーケンスは、自動的に削除されません。そのため、次のようなコマンド操作は多分失敗します:

CREATE TABLE tablename
(colname SERIAL);
DROP TABLE tablename;
CREATE TABLE tablename
(colname SERIAL);

シーケンスは DROP SEQUENCE コマンドを使って明示的に削除しない限りデータベース内に残っています。


参考:CREATE SEQUENCE
http://www.postgresql.jp/document/pg803doc/html/sql-createsequence.html

------

これは業務でちょっと調べた内容の(あくまで個人的な)技術メモ。
ちなみにPostgreSQLのバージョンは8.0.3に限定して書いています。

コメントする

※コメント・スパムが多いため、承認制を取っています。
  また、コメント返信がいつも遅くなりがちなのですが、、><
  コメント頂くと、とても嬉しいですので、お気軽にどうぞ♪