PostgreSQLのシーケンスを最大値にリセットする方法

PostgreSQL

primary keyがduplicateしたら、シーケンスを最大値にする必要がある

PostgreSQL使っていて、insert文を実行した後に、ちゃんとコミットされておらず、primary keyがduplicateだというエラーが出ました。
そこで、全てのシーケンスを最大値にしておきたいと思って調べていたら、良い方法があったので、メモしておきたいと思います。

シーケンスとは

シーケンス(SEQUENCE)は、PostgreSQLで、自動的に連番を生成する仕組みで、MySQLでいう auto increment で生成される連番のようなもののようです。

シーケンスのリセット方法

以下の方法でシーケンスのリセットが出来ます。

select setval('table_col_seq', 1)

全シーケンスの最大値をリセットするSQL文抽出

以下のSQLを実行することで、全シーケンスの最大値にリセット出来るSQLが発行出来ます。

select
  'select setval(''' || sequence || ''', (select max(' || column_name || ') from ' || table_name || '));' as setval
from
  (
    select
      table_name,
      column_name,
      substr(column_default, 10, length(column_default) - 21) as sequence
    from
      information_schema.columns
    where
      table_schema = 'public'
      and column_default like 'nextval(%'
  ) a;

あとは上記で発行されたSQLを実行することで、全リセットが出来るという感じです。
これは便利ですね。

最後に

PostgreSQLは文法的にもMySQLよりも厳しい印象がありますが、こういったシーケンスなどのことも厳しい印象ですね。

コメントを残す