\dsコマンドでシーケンス一覧を確認する

PostgreSQLでシーケンス一覧を確認するには、psqlコマンドラインツールの\dsコマンドを使う。

testdb=# \ds
             List of relations
 Schema |     Name      |   Type   | Owner
--------+---------------+----------+-------
 public | docs_id_seq   | sequence | postgres
 public | invoice_seq   | sequence | postgres
 public | orders_id_seq | sequence | postgres
 public | users_id_seq  | sequence | postgres
(4 rows)

serial型やGENERATED ... AS IDENTITY列を定義すると、列ごとにテーブル名_列名_seqという名前のシーケンスが自動生成される。invoice_seqのようにCREATE SEQUENCEで明示的に作成したシーケンスも同様に表示される。

\ds+でサイズも表示する

+を付けるとサイズなどの列が追加される。

testdb=# \ds+
                                 List of relations
 Schema |     Name      |   Type   | Owner | Persistence |    Size    | Description
--------+---------------+----------+-------+-------------+------------+-------------
 public | docs_id_seq   | sequence | postgres   | permanent   | 8192 bytes |
 public | invoice_seq   | sequence | postgres   | permanent   | 8192 bytes |
 public | orders_id_seq | sequence | postgres   | permanent   | 8192 bytes |
 public | users_id_seq  | sequence | postgres   | permanent   | 8192 bytes |
(4 rows)

シーケンスは1件あたり固定で1ページ(8192バイト)を使用するため、Size列はどのシーケンスも同じ値になる。

\d シーケンス名で個別のシーケンス設定を確認する

\dsは一覧だけを表示するが、\dに特定のシーケンス名を指定すると開始値・最小値・最大値・増分などの設定を確認できる。

testdb=# \d invoice_seq
                        Sequence "public.invoice_seq"
  Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache
--------+-------+---------+---------------------+-----------+---------+-------
 bigint |  1000 |       1 | 9223372036854775807 |         1 | no      |     1

Cycles?noの場合、最大値に達すると次のnextval()はエラーになる。採番の上限に近い運用をしている場合は、この設定を確認しておく。

pg_sequencesでシーケンス一覧と現在値を確認する

PostgreSQL 10以降ではpg_sequencesシステムビューでシーケンスの一覧と現在値を1つのクエリで取得できる。

testdb=# SELECT schemaname, sequencename, last_value
testdb-# FROM pg_sequences
testdb-# WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
testdb-# ORDER BY sequencename;
 schemaname | sequencename  | last_value
------------+---------------+------------
 public     | docs_id_seq   |
 public     | invoice_seq   |
 public     | orders_id_seq |          3
 public     | users_id_seq  |          4
(4 rows)

last_valueは一度もnextval()が呼ばれていないシーケンスではNULLになる。docs_id_seqinvoice_seqはまだ一度も採番されていないため空欄、orders_id_sequsers_id_seqINSERTによってすでに採番済みのため実際の値が表示される。

information_schema.sequencesでシーケンス一覧を確認する

標準SQLに準拠した方法でシーケンス一覧を取得する場合はinformation_schema.sequencesを参照する。

testdb=# SELECT sequence_schema, sequence_name
testdb-# FROM information_schema.sequences
testdb-# WHERE sequence_schema = 'public'
testdb-# ORDER BY 1, 2;
 sequence_schema | sequence_name
-----------------+---------------
 public          | docs_id_seq
 public          | invoice_seq
 public          | orders_id_seq
 public          | users_id_seq
(4 rows)

information_schema.sequencesには現在値は含まれない。現在値も一緒に欲しい場合はpg_sequencesを使う方が手軽である。

\dsとpg_class(relkind = ‘S’)の関係

psqlの\dsは内部的にpg_classrelkind = 'S'で絞り込んでいる。

testdb=# SELECT n.nspname, c.relname
testdb-# FROM pg_class c
testdb-# JOIN pg_namespace n ON n.oid = c.relnamespace
testdb-# WHERE c.relkind = 'S'
testdb-# AND n.nspname = 'public'
testdb-# ORDER BY 1, 2;
 nspname |    relname
---------+---------------
 public  | docs_id_seq
 public  | invoice_seq
 public  | orders_id_seq
 public  | users_id_seq
(4 rows)

権限に関係なく全シーケンスを確認したい場合や、他のrelkind(テーブルはr、ビューはv)と組み合わせて一括で調査したい場合に使う。

参考: 【PostgreSQL】ビュー一覧を確認する

参考