目次
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よりも厳しい印象がありますが、こういったシーケンスなどのことも厳しい印象ですね。