\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_seqとinvoice_seqはまだ一度も採番されていないため空欄、orders_id_seqとusers_id_seqはINSERTによってすでに採番済みのため実際の値が表示される。
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_classをrelkind = '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)と組み合わせて一括で調査したい場合に使う。
