6. SQL 文の仕様
6.3 シーケンス
6.3.1 シーケンスの使い方
シーケンス(SEQUENCE)は自動的に一意な数値を生成するオブジェクトで、CREATE
SEQUENCE文を使って作成します。詳しい使用方法はマニュアル12を参照してください。
シーケンスを使って値を取得するには、nextval関数にシーケンス名を指定します。現在 の値を取得するためにはcurrval関数を指定します。
セッション内でnextval関数を実行しない状態でcurrval関数を実行するとエラーになり ます。
例 126 シーケンスの利用
シ ー ケ ン ス 一 覧 は 、 psql ユ ー テ ィ リ テ ィ の ¥ds コ マ ン ド ま た は 、
information_schema.sequencesビューを参照します。またシーケンスの個別の情報を取得
するには、シーケンス名をテーブル名に指定してSELECT文を実行します。
12 マニュアルはhttp://www.postgresql.org/docs/9.4/static/sql-createsequence.html postgres=> CREATE SEQUENCE seq01 ;
CREATE SEQUENCE
postgres=> SELECT currval('seq01') ;
ERROR: currval of sequence "seq01" is not yet defined in this session postgres=> SELECT nextval('seq01') ;
nextval --- 1 (1 row)
postgres=> SELECT currval('seq01') ; currval
--- 1 (1 row)
scottdb=>
例 127 シーケンスの情報取得
SELECT * FROM seq01;
6.3.2 キャッシュ
CREATE SEQUENCE文にはCACHE句を指定できます。この属性にはシーケンス値を
キャッシュする個数を指定できます。CACHE 句のデフォルト値は 1 で、キャッシュは生 成されません。マニュアルには「The optional clause CACHE cache specifies how many sequence numbers are to be preallocated and stored in memory for faster access. The minimum value is 1 (only one value can be generated at a time, i.e., no cache), and this
is also the default.」と記載されていますが、memoryがどのメモリー領域を指すのかは記
載されていません。
実際にキャッシュが行われるメモリー領域はバックエンド・プロセスpostgresの仮想メ モリー領域です。あるシーケンスに対して複数のセッションがシーケンス値を取得すると、
それぞれのセッションに対応するキャッシュが生成されます。同一の値が取得されること はありませんが、シーケンス値の大小関係と時系列は一致しなくなります。
postgres=> \ds+
List of relations
Schema | Name | Type | Owner | Size | Description ---+---+---+---+---+--- public | seq01 | sequence | scott | 8192 bytes |
(1 row)
postgres=> SELECT sequence_schema, sequence_name, start_value FROM information_schema.sequences ;
sequence_schema | sequence_name | start_value ---+---+--- public | seq01 | 1
(1 row)
postgres=> SELECT sequence_name, start_value, cache_value FROM seq01 ; sequence_name | start_value | cache_value
---+---+--- seq01 | 1 | 1 (1 row)
例 128 シーケンス値のキャッシュと時系列
上記の例ではまず、CACHE 10を指定してシーケンスを作成し、nextval関数で値を取得 しています。この時点でSESSION#1セッションにはキャッシュとして1~10が作成され ます。次にSESSION#2セッションでnextval関数を実行すると、別のキャッシュ11~20 が作成され、nextval関数には11が返ります。
PostgreSQL 9.4 ではセッション内のシーケンス・キャッシュを削除する DISCARD
SEQUENCES文が利用できるようになりました。
(SESSION#1) postgres=> CREATE SEQUENCE seq01 CACHE 10 ; CREATE SEQUENCE
(SESSION#1) postgres=> SELECT nextval('seq01') ; nextval
--- 1 (1 row)
(SESSION#2) postgres=> SELECT nextval('seq01') ; nextval
--- 11 (1 row)
(SESSION#1) postgres=> SELECT nextval('seq01') ; nextval
--- 2 (1 row)
(SESSION#2) postgres=> SELECT nextval('seq01') ; nextval
--- 12 (1 row)
6.3.3 トランザクション
シーケンス値はトランザクションとは独立しています。トランザクション中に取得した シーケンス値はロールバックできません。
例 129 シーケンスとトランザクション
postgres=> BEGIN ; BEGIN
postgres=> SELECT nextval('seq01') ; nextval
--- 3 (1 row)
postgres=> ROLLBACK ; ROLLBACK
postgres=> SELECT nextval('seq01') ; nextval
--- 4 (1 row) postgres=>