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の出力が同じになっていることを確認する
参考