1. はじめに
新人向けの研修でPostgreSQLのシーケンスについて説明した内容です。シーケンスを使ったことがない人には役立つかと思います。新人向けに他にも記事を書いていますので興味のある方は参照ください。
2. シーケンスとは?
シーケンスとは連番となる一意な整数を生成するデータベースのオブジェクトです。
ちなみに、テーブル、ビュー、インデックス等もデータベースのオブジェクトです。
一般的にシーケンスは、ユーザIDや登録番号等の主キーを生成する際によく利用されます。
シーケンスはトランザクションのコミットやロールバックに関係なく、採番(取得)した時点でインクリメントされます。
3. シーケンスの作り方
シーケンスはCREATE SEQUENCE
文で作成します。
ここでは1から99999999までの連番を生成する「CUSTOMER_CODE_SEQ」というシーケンスを作成してみます。
CREATE SEQUENCE CUSTOMER_CODE_SEQ
INCREMENT BY 1
MAXVALUE 99999999
START WITH 1
NO CYCLE
;
NO CYCLEが指定された場合、シーケンスの限界値に達した後のnextval呼び出しは全てエラーになります。
https://www.postgresql.jp/document/9.3/html/sql-createsequence.html
4. シーケンスを取得する
シーケンスの取得には「nextval
」関数を利用します。
シーケンス名を文字列として指定する点に注意してください。
-- nextval('シーケンス名')
select nextval('customer_code_seq')
シーケンスは整数なので0埋めしたい場合やプレフィックスを付与したい場合、to_char関数や文字結合と合わせて利用します。
-- 0埋め8桁の形式で取得したい場合(例:00001234)
select to_char(nextval('customer_code_seq'), 'FM00000000')
-- プレフィックスとして'CSM'を付与した場合(例:CSM00001234)
-- select 'CSM' || to_char(nextval('customer_code_seq'), 'FM00000000')
5. シーケンスの現状を確認する
シーケンスの現状を確認したい場合、テーブルやビューのようにfromにシーケンスを指定して参照します。
-- select * from シーケンス名
select * from customer_code_seq
ここで注目すべきは現在のシーケンス値を示すlast_value
カラムと、シーケンス値の増分を示すincrement_by
カラムです。
次に取得するシーケンス値は「last_value + increment_by
」になります。
仮にlast_valueが23、increment_byが1の場合、次に取得するシーケンス値は24になります。
6. シーケンスの削除
シーケンスの削除はDROP SEQUENCE
文で行います。
-- drop sequence シーケンス名
drop sequence customer_code_seq;
7. さいごに
今回はPostgreSQLのシーケンスについて説明しました。もちろんOracleなど他のRDBMSにもシーケンスは存在します。しかしRDBMSによってシーケンスの取得方法や確認方法は異なります。実際のシステム開発でもシーケンスはよく利用されるので、利用できるようにしていきましょう。