Rails で PostgreSQL を使っている際に #create すると UniqueViolation エラーが出る場合

原因の一つとして考えられるもの

id を明示的に指定してレコードを作成した履歴がありませんか? seed のデータを投入する場合にやりがちです。

たとえば、以下のようにして user のレコードを作った場合です。

User.create(
  id: 100,
  name: 'taro',
  age: 24
)

なぜエラーになるのか

id を明示的に指定してレコードを作った場合は、PostgreSQL の内部で自動採番が行われないので、 Active Record が自動で id を割り当てる際にバッティングするから*1

どうすればいいか

レコードの追加の際には id を明示的に指定しないようにします。もし id を明示的に指定してレコードを追加したい場合には、レコード追加後に手動で採番を調整しましょう*2

わかりやすい記事を書いてくださっている方がいらっしゃいます。

eienshinjin.hatenablog.com

エラーメッセージの例

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint ......

*1:Active Record が自動で id を割り当てる際には、PostgreSQL の内部情報を見るから

*2:ただ、Active Record を使う限りでは id を明示的に指定する場面は少ないと思います

Powered by はてなブログ