rails6 DB書き込み時エラー「ERROR: duplicate key value violates unique constraint」が発生した場合の対処法

rails6 DB書き込み時エラー「ERROR: duplicate key value violates unique constraint」が発生した場合の対処法

rails6で、APIでpost時にエラー「ERROR: duplicate key value violates unique constraint」が発生した場合の対処法を記述してます。railsのバージョンは6.1.0です。

環境

  • OS ubuntu20.10
  • ruby 2.7.2
  • rails 6.1.0
  • Postgresql 13.1 (dockerで構築)

エラー全文

APIでpost実行時に発生。
※プライマリキーの制約名は「customers_pkey」

ActiveRecord::RecordNotUnique in Api::CustomersController#create
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "customers_pkey"
DETAIL: Key (id)=(6) already exists.

対象テーブル

原因

DB側のシーケンス値を、誰かがリセットしていたために発生。

対処法

DB側のテーブルのシーケンス値を正しく設定してあげる

SELECT setval('customers_id_seq', coalesce((SELECT MAX(id)+1 FROM customers), 1), false);

構文

SELECT setval('テーブル名_id_seq', coalesce((SELECT MAX(id)+1 FROM テーブル名), 1), false);

以下を実行して、postできることが確認できました。

curl -X POST localhost:3000/api/customers -d 'customer[name]=test&cust
omer[email]=test@test.com'