読者です 読者をやめる 読者になる 読者になる

/* あとでなおす */

友達募集中

【PostgreSQL】テーブルデータに合わせてシーケンスをリセットする

PostgreSQLにてシーケンス番号をリセットするSQLです。

テストデータのINSERTやDELETEを何度も繰り返しているうちに
シーケンス番号とテーブルのレコード件数が合わなくなってしまった時などに使用します。
シーケンス番号とレコード件数は別に合わせなければいけないわけではないですが
「最初の1件目をINSERTしたのにシーケンス番号が3から始まるのは気持ち悪い」とか
「今テーブルに2000件入っているので次にINSERTされるシーケンス番号は2001にしたい」
といった要望が世の中はあるかと思いますので、メモとして残します。

次にINSERTするシーケンス番号が今のレコード件数+1から始まるように設定

SELECT pg_catalog.setval(
  '<対象のシーケンス名>',
  (SELECT COUNT(1) + 1 FROM <対象のテーブル名>),
  false);

次にINSERTするシーケンス番号が今のレコードの最大値+1から始まるように設定

※レコード件数が0件の場合は1から始まるよう設定

SELECT pg_catalog.setval(
  '<対象のシーケンス名>',
  COALESCE((SELECT MAX(<対象の列名>) + 1 FROM <対象のテーブル名>) , 1),
  false);

補足

上記のSQLはSELECT文ですが、実行するとシーケンス番号がUPDATEされます。
また、pg_catalog.setvalはトランザクションの適応外です。
ROLLBACKしてもシーケンス番号は変わってしまいますのでご注意ください。