# Rails: ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email"

**Code:** `ActiveRecord::RecordNotUnique: duplicate key value` · **Category:** Ruby / Rails · **Seen on:** Ruby, PostgreSQL

A unique index rejected an insert/update because the value already exists.

## Meaning

Validations (`validates :email, uniqueness: true`) don't prevent races; the DB constraint does. Rescue `RecordNotUnique`, use `find_or_create_by` inside a retry, or `upsert`. Also check sequences out of sync after data imports (`PG::UniqueViolation ... Key (id)=(1)`).

## Common causes

- Duplicate email/slug/code
- Race between validation and insert
- Primary key sequence behind max(id) after import
- Seeds run twice
- Retry causing double insert

## Quick fix

1. `begin; ...; rescue ActiveRecord::RecordNotUnique; retry; end` or `upsert`
2. Reset sequences: `ActiveRecord::Base.connection.reset_pk_sequence!("users")`
3. Keep a unique index plus validation

## Detailed fix by platform

### Rails

1. `User.upsert({ email: e, name: n }, unique_by: :email)`

## How to diagnose

1. **Index** — Which?
2. **Race** — Concurrent?
3. **Sequence** — In sync?

---
Source: [WhatIsMyError](https://whatismyerror.com/errors/ruby/activerecord-recordnotunique)
