LoginSignup
185
161

More than 5 years have passed since last update.

新人にPostgreSQLのシーケンスを理解してもらう

Posted at

1. はじめに

新人向けの研修でPostgreSQLのシーケンスについて説明した内容です。シーケンスを使ったことがない人には役立つかと思います。新人向けに他にも記事を書いていますので興味のある方は参照ください。

2. シーケンスとは?

シーケンスとは連番となる一意な整数を生成するデータベースのオブジェクトです。
ちなみに、テーブル、ビュー、インデックス等もデータベースのオブジェクトです。
一般的にシーケンスは、ユーザIDや登録番号等の主キーを生成する際によく利用されます。
シーケンスはトランザクションのコミットやロールバックに関係なく、採番(取得)した時点でインクリメントされます。

3. シーケンスの作り方

シーケンスはCREATE SEQUENCE文で作成します。
ここでは1から99999999までの連番を生成する「CUSTOMER_CODE_SEQ」というシーケンスを作成してみます。

シーケンスを作成するDDL
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」関数を利用します。
シーケンス名を文字列として指定する点に注意してください。

シーケンスを取得するSQL
-- nextval('シーケンス名')
select nextval('customer_code_seq')

シーケンスは整数なので0埋めしたい場合やプレフィックスを付与したい場合、to_char関数や文字結合と合わせて利用します。

フォーマットを指定してシーケンスを取得するSQL
-- 0埋め8桁の形式で取得したい場合(例:00001234)
select to_char(nextval('customer_code_seq'), 'FM00000000')

-- プレフィックスとして'CSM'を付与した場合(例:CSM00001234)
-- select 'CSM' || to_char(nextval('customer_code_seq'), 'FM00000000')

5. シーケンスの現状を確認する

シーケンスの現状を確認したい場合、テーブルやビューのようにfromにシーケンスを指定して参照します。

シーケンスの現状を確認するSQL
-- 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文で行います。

シーケンスを削除するDDL
-- drop sequence シーケンス名
drop sequence customer_code_seq;

7. さいごに

今回はPostgreSQLのシーケンスについて説明しました。もちろんOracleなど他のRDBMSにもシーケンスは存在します。しかしRDBMSによってシーケンスの取得方法や確認方法は異なります。実際のシステム開発でもシーケンスはよく利用されるので、利用できるようにしていきましょう。

185
161
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
185
161