Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

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

f:id:naohide_a:20151202194604p:plain

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

シーケンスとは

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

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

以下の方法でリセットが出来ます。

select setval('table_col_seq', 1)

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

こちらのQiitaの記事がとても参考になりました。 以下の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を実行することで、全リセットが出来るという感じです。 これは便利ですね!