PostgreSQLのシーケンス操作について
準備
バージョン
SHOW server_version;
server_version
14.13 (Ubuntu 14.13-0ubuntu0.22.04.1)
シーケンスを作成
- SERIAL型
- https://www.postgresql.jp/document/16/html/datatype-numeric.html#DATATYPE-SERIAL
シーケンスを確認
- pg_class
- システムカタログ
- リレーションの一種であることが分かる
- https://www.postgresql.jp/docs/16/catalog-pg-class.html
SELECT relname, oid FROM pg_class WHERE relkind = 'S' ;
- pg_sequence
- システムカタログ
- https://www.postgresql.jp/docs/16/catalog-pg-sequence.html
SELECT * FROM pg_sequence ;
- pg_sequences
- システムビュー
- https://www.postgresql.jp/document/16/html/view-pg-sequences.html
SELECT * FROM pg_sequences ;
- 個別のシーケンス確認
SELECT * FROM users_id_seq ;
シーケンス操作
https://www.postgresql.jp/docs/16/functions-sequence.html
nextval
- is_calledがfalseの場合、last_valが進めず、is_calledがtrueになる
- is_calledがtrueの場合、last_valを進める
SELECT nextval('users_id_seq');
setval
- シーケンス名、last_val、is_calledを指定できる
- is_calledはoptionalでdefault true
SELECT setval('users_id_seq', 56);
log_cntについて
- nextvalが呼ばれると値は32となり、nextvalが呼ばれるたびに減っていく。0の次は32
- setvalを呼び出すと0になる
- https://stackoverflow.com/questions/66456952/what-does-log-cnt-mean-in-the-postgres-sequence
- nextvalの都度WALレコードの書き込みは行わず、バッファリングしているという理解
lastvalだけを変更する
- ALTER SEQUENCE
- is_createdがfalseになった
ALTER SEQUENCE users_id_seq RESTART WITH 50 ;
- GUIのDBクライアントを使いlast_valを変更してみると、下記のクエリが発行されていた
- is_calledがfalseになり、シーケンスが適用されているカラムの最大値と、シーケンスのlast_valが同じ場合、last_valの値をnextvalが返すことになる
- 主キー制約が貼られている場合は、duplicate key valueなエラーが発生する
- is_calledがfalseになり、シーケンスが適用されているカラムの最大値と、シーケンスのlast_valが同じ場合、last_valの値をnextvalが返すことになる
ALTER SEQUENCE public.users_id_seq RESTART 53 ;