../../image/benilogo.gifPostgreSQL について


PostgreSQL の SEQUENCE 型について。
sequence 型
 自動採番型とでも言うのか? シーケンス
 辞書的な意味は 《続いて起こる》 順序; 続いて起こること, 連続; 一連のもの[こと]. 
 
 要するに、一連の連続番号を取り出すための 自動連番生成器 とでも思えばいい。
 プログラムでは自動採番として作っていたけど、これは PostgreSQL での組み込みである。
 MS-ACCESS の Auto オートナンバー型の仕組み そのもの と考えればわかり易いかも。 ACCESS と違って細かく制御
 出来るようです。 


実際に試してみればすぐわかる。
sequence 型の作成
beniya=# create sequence a_seq
beniya-# ;
CREATE

 
 create sequence a_seq で SEQUENCE を作成する。



   
           List of relations
       Name        |   Type   | Owner
-------------------+----------+--------
 a_attr1           | table    | beniya
 a_seq             | sequence | beniya

  • a_seq という名前で sequence 型 が出来ている。

Type sequence は下記のようなテーブルでした。 ・・・・ 正確にはただのテーブルとは違うようで シーケンスはシーケンスで
つまり、ナンバー管理テーブルとでも言うのか 連番発生テーブルである。 と理解したほうがいいのかな。

select * from a_seq;
beniya=# 
 sequence_name | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 a_seq         |          1 |            1 | 9223372036854775807 |         1 |           1 |      1 | f         | t
(1 row)

select \d a_seq; で構造確認
    Sequence "a_seq"
    Column     |  Type
---------------+---------
 sequence_name | name
 last_value    | bigint
 increment_by  | bigint
 max_value     | bigint
 min_value     | bigint
 cache_value   | bigint
 log_cnt       | bigint
 is_cycled     | boolean
 is_called     | boolean

Column Type default 説明
sequence_name name シーケンス名 作成されるシーケンスの名前です。
last_value bigint 1 最終更新値 
increment_by bigint 1 増加量を設定します。
max_value bigint 9223372036854775807 シーケンス番号の最大値を決定します。
min_value bigint 1 シーケンス番号として作成できる最小の値を決定します。
cache_value bigint 1 あらかじめシーケンス番号の割り当て defauilt 1
log_cnt bigint 1 31・・32 ?? なんだろう?
is_cycled boolean f 輪番みたいに最大値になったとき回転させるかどうか
is_called boolean t

 このシーケンスを操作するには nextval( ),currval( ),setval( ) の関数を用いて行います。
nextval( )
beniya=# select nextval('a_seq');
 nextval
---------
       2
(1 row)

beniya=# select nextval('a_seq');
 nextval
---------
       3
(1 row)

beniya=# select nextval('a_seq');
 nextval
---------
       4
(1 row)

  • nextval を呼び出すたびに 加算された結果を返しています。
currval( )
beniya=# select currval('a_seq');
 currval
---------
       4
(1 row)

beniya=# select currval('a_seq');
 currval
---------
       4
(1 row)

beniya=# select currval('a_seq');
 currval
---------
       4
(1 row)

  • currval は現在の結果を返しています。
    加算していない現在の値をそのまま返す。
setval( )
beniya=# select setval('a_seq',26);
 setval
--------
     26
(1 row)

beniya=# select nextval('a_seq');
 nextval
---------
      27
(1 row)

beniya=# select last_value from a_seq;
 last_value
------------
         27
(1 row)

  • setval で last_value の値を変更できるようです。

テーブルとよく似ているので UPDATE 文が使えるのかと実験してみたが
beniya=# update a_seq SET last_value = 30;
ERROR:  You can't change sequence relation a_seq
として UPDATE 文では変更出来ない。

これ以外の値も UPDATE 文で変更出来るのかと やってみたけれど ダメでした。 もちろん INSERT も不可。
もし、これらの設定を変更したい場合は 一旦、削除して( DROP SEQENCE ) で CREATE SEQUENCE のパラメーターとして
設定し直す必要があるようです。
ともかく SEQUENCE を操作するには 上記の 3 つの関数を使えばいい ということのようです。






 ・・・・




目次に戻る

2005/09/26 start ********* Last Update 2006/06/01 19:32 JST

(C) Y.Kondou,2005,2006 All Rights, Reserved.
その他、お気づきの点がありましたら連絡先はこちらから