●【PostgreSQL】 OIDとSERIAL
![]()
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からサポートされています。
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に限定して書いています。





