matomomomemo

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なエラーが発生する
ALTER SEQUENCE public.users_id_seq RESTART 53 ;