LoginSignup
2

More than 3 years have passed since last update.

duplicate key value violates unique constraint "xxx_pkey"

Last updated at Posted at 2019-10-11

PostgreSQLでInsertした際にprimary keyの重複を示すエラーが発生した。

pq: duplicate key value violates unique constraint "tablename_pkey"

原因

PostgreSQLではprimary key(column_name:id)にSERIAL型を指定したとき、シーケンスが自動生成される。シーケンスはcolumnのデフォルト値に連番を割り当てる。(MySQLのAUTO_INCREMENTよろしく)
しかし、シーケンスからの自動採番を使わないInsertにより、レコードとシーケンスにズレが生じ、primary keyが重複してしまった。

確認

max > currvalの場合衝突する可能性がある

-- pkeyの最大値を確認する
SELECT MAX(id) FROM tablename;

-- シーケンスの現在値を確認する
SELECT currval('tablename_id_seq');
-- or ↓ のlast_valueでシーケンスの現在値を確認する
SELECT * FROM tablename_id_seq;

対応:シーケンスにpkeyの最大値をセットしてズレを解消する

SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename));

確認のsqlの出力が同じになっていることを確認する

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2