• 検索結果がありません。

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=>