PostgreSQLでシーケンスの値を同期

PostgreSQLで、型がserialまたはbigserialのようなシーケンスで管理される型のカラムが存在するテーブルに、シーケンス値を使用しないような方法でデータを登録した場合に、シーケンスの値がずれる場合がある。

そのような場合は以下のようにしてシーケンス値を存在する値の最大値に設定すれば良い。(ID列をシーケンス値で自動採番するようなテーブルを想定)

-- 「person_id_seq」シーケンスの値をpersonテーブルIDの最大値に更新
SELECT setval('person_id_seq', (SELECT max(id) FROM person));

テーブルが空の場合は以下のようにする。

SELECT setval('person_id_seq', coalesce((SELECT max(id) FROM person), 1), coalesce((SELECT max(id) <> null FROM person), false));