PostgreSQL の SERIAL型

参考 URL

  1. http://www.linux.or.jp/JF/JFdocs/PostgreSQL-FAQ.html#item4.11.1
  2. http://www.postgresql.jp/document/pg814doc/html/datatype.html#DATATYPE-SERIAL
  3. http://www.postgresql.jp/document/pg814doc/html/sql-createsequence.html

1. はイントロダクションとして,2. は SERIAL の定義,3. は SERIAL 型を深く知る上で欠かせない SEQUENCE の定義,についての文書になります。

自分にとって必要な情報をまとめると,

  • SEQUENCE 自体は 8 バイト。テーブルに格納する値として INT4 に対応する SERIAL (SERIAL4) 型と INT8 に対応する BIGSERIAL (SERIAL8) 型がある。signed integer であることに注意。《上記 2, 3》
  • 7.3 以降では SERIAL に自動的に UNIQUE 制約は付かない。必要に応じて UNIQUE 制約や PRIMARY KEY 制約を自分でつけるべき。《上記 2》
  • 7.3 以降では SERIAL によって作られた SEQUENCE はテーブルを削除すると自動的に削除される(楽〜)。《上記 2》
  • SEQUENCE の currval() は他のユーザとのあいだで競合状態に陥ることはない。《上記 1》
  • トランザクションが中断した場合でも SEQUENCE / SERIAL は進む。《上記 1》
  • SEQUENCE (SERIAL) はデフォルトではラップアラウンドしない。SEQUENCE 生成時にCYCLE オプションをつけるとループする。もちろん UNIQUE 等と併用すると危ないと思う。《上記 3》

ということで,単純に SERIAL 型を使うと,(signed) INT4 型になるので,最大値は 2147483647 になります。システムを10年間(3650日)使うとすると,1日あたり,約 580000 。コンスタントに利用されるとして 1秒あたり約 6。たいていの用途では通常の SERIAL 型で間に合いそうです。