エンジニア日記

日々の開発あれこれ

PostgreSQLでのAUTO_INCREMENTのしくみ

PostgreSQLでのPrimaryKeyはシーケンス番号で管理されている。
MySQLだと特に気にしなくてもいいのだがPostgreSQLで特に何も気にしてなかったときにエラーとなった事象。

テーブル定義

1
 hoge_id | integer | not null default nextval('mst_hoge_hoge_id_seq'::regclass)

hoge_idの登録状況

1
2
3
4
5
select  hoge_id from mst_hoge order by  hoge_id desc limit 2;
  hoge_id
---------------------
                 110
                 109

hoge_id を nextval で取得しアプリケーションからINSERTを行ったところあるときに突然下記エラーとなった。

1
postgres: ERROR: duplicate key value violates unique constraint "mst_hoge_pkey" 

原因

テストデータで直接INSET文を実行したときにmst_hoge_ hoge_id_seqの値を同様に更新する考慮が漏れていた。
結果、nextvalで取得できる値がテストデータ投入前時のhoge_idが返却され、一意制約エラーとなった。

対応

1
2
3
4
5
6
SELECT setval('mst=hoge_id_seq', 最後の数値);  -- これで値が書きかわる 

select last_value from mst_hoge_ hoge_id_seq;  -- 確認
 last_value
------------
        110