Referencia técnica independienteSitio oficial
  • Software y sistemas
  • Base de datos

23505

PostgreSQL 23505 unique_violation: clave duplicada en una tabla

Verificada con fuentes2 fuentesRevisada 4 oct 2026
¿Viene un técnico? Mira los 2 pasos que debe enseñarte
Trace

Evidencia vinculada a esta decisión

Ver fuente: PostgreSQL current error codes appendix

Nivel de riesgo

Seguro

Puedes actuar sin peligro siguiendo las comprobaciones seguras.

Urgencia

Media — atiéndelo hoy

Respuesta rápida

23505 (unique_violation) indica que un INSERT o UPDATE intentó guardar un valor que ya existe en una columna con restricción única o clave primaria. Revisa el nombre de la restricción en el error y busca la fila que ya tiene ese valor antes de reintentar.

Seguridad primero

Antes de continuar

  • No elimines la restricción única para que desaparezca el error: dejarías entrar duplicados que la restricción existe para impedir.
  • No analices el texto del mensaje para decidir: PostgreSQL recomienda usar el código de error y los campos separados, porque el texto puede traducirse o cambiar.

Puedes hacerlo con seguridad

  • Nombre de la restricción en el error
  • Definición de la restricción
  • Fila que ya tiene el valor
  • Secuencia frente al máximo de la columna

Deja estas tareas a un profesional cualificado

  • No intentes esta tarea profesional: Inserción idempotente con ON CONFLICT
  • No intentes esta tarea profesional: Corrección de datos o de la secuencia

Lo que un técnico debe poder justificar

Viene un técnico

Estos son los pasos que tiene que hacer y enseñarte. Márcalos mientras trabaja: si se salta pasos, no aceptes el cambio de pieza.

No son instrucciones para que abras o manipules el equipo. Son las comprobaciones que deben sostener una conclusión técnica.

  1. Inserción idempotente con ON CONFLICT

    Qué haceEl desarrollador cambia la escritura a INSERT ... ON CONFLICT DO NOTHING o DO UPDATE sobre la restricción concreta, si la lógica lo permite.

    Te tiene que enseñarla consulta modificada y una prueba con dos inserciones iguales.

    Por escritoqué restricción arbitra el conflicto y qué acción se toma.

  2. Corrección de datos o de la secuencia

    Qué haceEl administrador de la base de datos elimina o fusiona duplicados reales, o ajusta la secuencia con setval, dentro de una transacción revisada.

    Te tiene que enseñarel recuento de duplicados y los valores de la secuencia antes y después.

    Por escritola sentencia ejecutada, la fecha y quién la aprobó.

Antes de aceptar una pieza o reparación

Aún no ha demostrado nada. No aceptes un cambio de pieza solo por el código.

Sigue estos pasos

Aviso: Sigue el orden documentado. Un código identifica el sistema afectado, pero por sí solo no demuestra qué pieza está averiada.

  1. Nombre de la restricción en el error

    Sin herramientas especiales

    Quién:
    desarrollador o administrador de la base de datos.
    Cómo:
    lee el campo de nombre de restricción del error (campo n del protocolo) y los de esquema y tabla, no solo el texto traducido del mensaje.
    Resultado que importa:
    qué restricción o índice único se ha violado.
    Si es la clave primaria:
    apunta a datos repetidos o a una secuencia desfasada.
    Si es otra restricción única:
    indica una regla de negocio; revisa sus columnas.
    Evidencia a conservar:
    registro del error completo con sqlstate, restricción y tabla.

    Evidencia: PostgreSQL current error codes appendix · PostgreSQL error and notice fields

  2. Definición de la restricción

    Sin herramientas especiales

    Quién:
    desarrollador o administrador de la base de datos.
    Cómo:
    consulta pg_indexes para ver la indexdef del índice afectado: columnas, predicado parcial y NULLS NOT DISTINCT.
    Resultado que importa:
    qué combinación de columnas debe ser única.
    Si incluye columnas que no esperabas:
    confirma que la restricción es más estricta que la lógica de la aplicación.
    Si coincide con lo esperado:
    descarta la definición y busca el dato repetido.
    Evidencia a conservar:
    copia de la indexdef consultada.

    Evidencia: PostgreSQL current pg_indexes system view · PostgreSQL constraints

  3. Fila que ya tiene el valor

    Sin herramientas especiales

    Quién:
    desarrollador o administrador de la base de datos.
    Cómo:
    ejecuta un SELECT filtrando por los valores que intentabas guardar en las columnas de la restricción.
    Resultado que importa:
    si existe ya una fila con ese valor.
    Si aparece una fila:
    confirma el duplicado; decide si actualizar esa fila o rechazar la entrada.
    Si no aparece y la columna es id con secuencia:
    apunta a la secuencia o a una escritura concurrente.
    Evidencia a conservar:
    resultado de la consulta y hora.

    Evidencia: PostgreSQL current error codes appendix · PostgreSQL constraints

  4. Secuencia frente al máximo de la columna

    Requiere herramientas

    Quién:
    administrador de la base de datos.
    Cómo:
    compara el último valor de la secuencia con el máximo de la columna id; si va por detrás, ajústala con setval tras revisar el impacto.
    Resultado que importa:
    si nextval va a devolver valores ya usados.
    Si la secuencia está por debajo del máximo:
    confirma la causa; tras setval el siguiente nextval avanza desde ese valor.
    Si va por delante:
    descarta la secuencia y revisa la concurrencia.
    Evidencia a conservar:
    valores antes y después del ajuste.

    Cambiar una secuencia en producción afecta a todas las inserciones: no lo hagas sin permisos de administrador ni sin copia de seguridad.

    Evidencia: PostgreSQL sequence manipulation functions

Situación no resuelta

Si el error persiste, no sigas probando por tu cuenta. Mira qué tiene que hacer y enseñarte el técnico.

Técnico virtual

¿Sigue apareciendo 23505 tras comprobarlo?

Este recorrido usa el código exacto y tus respuestas para elegir una prueba, su resultado esperado y la siguiente bifurcación.

Dónde se aplica este código

Un código solo tiene significado dentro del producto y la versión correctos.

Ámbito principal

Sistema
Software y sistemas
Marca
PostgreSQL
Tipo de producto
Base de datos

Variantes conocidas del código

  • PostgreSQL 23505
  • SQLSTATE 23505
  • unique_violation

Qué significa

PostgreSQL clasifica 23505 como unique_violation dentro de la clase 23, violación de restricción de integridad. Salta cuando dos filas de la tabla quedarían con valores iguales en todas las columnas de una restricción UNIQUE, de una clave primaria o de un índice único. El servidor envía el nombre de la restricción o del índice en un campo propio del error. Por defecto dos NULL no se consideran iguales. El código no dice si el duplicado viene de datos repetidos, de una secuencia desfasada o de dos transacciones simultáneas.

Advertencias y condiciones de parada

  • Precauciónadvertencia editorial

    No elimines la restricción única para que desaparezca el error: dejarías entrar duplicados que la restricción existe para impedir.

    Evidencia: PostgreSQL constraints

  • Seguroverificada con fuente

    No analices el texto del mensaje para decidir: PostgreSQL recomienda usar el código de error y los campos separados, porque el texto puede traducirse o cambiar.

    Evidencia: PostgreSQL current error codes appendix

Síntomas y causas

Causas probables · en orden

  • El valor ya existe en la tablaFrecuente

    La aplicación inserta o actualiza con un valor que otra fila ya tiene en la columna única. Se confirma consultando la tabla por ese valor y encontrando la fila previa.

    Evidencia: PostgreSQL current error codes appendix · PostgreSQL constraints

  • Secuencia por detrás de los datosPosible

    La clave la genera una secuencia con nextval y la secuencia devuelve un valor que ya ocupa una fila, por ejemplo tras cargar datos con identificadores explícitos. Encaja si el duplicado está en la columna id.

    Evidencia: PostgreSQL constraints · PostgreSQL sequence manipulation functions

  • Dos escrituras simultáneasPosible

    Dos sesiones intentan insertar la misma clave a la vez y solo una gana. Encaja si el error es intermitente y desaparece al reintentar; INSERT con ON CONFLICT da un resultado atómico.

    Evidencia: PostgreSQL current INSERT and ON CONFLICT documentation

  • Restricción más estricta de lo esperadoPosible

    Una restricción sobre varias columnas, un índice único parcial o con NULLS NOT DISTINCT bloquea combinaciones que la aplicación creía válidas. Se ve en la definición del índice.

    Evidencia: PostgreSQL current pg_indexes system view · PostgreSQL constraints

Fuentes y referencias técnicas

  1. 1

    PostgreSQL current error codes appendix

    PostgreSQL Global Development Group · 2026 · official_doc

  2. 2

    PostgreSQL current INSERT and ON CONFLICT documentation

    PostgreSQL Global Development Group · 2026 · official_doc

Fuentes: PostgreSQL current error codes appendix · PostgreSQL current INSERT and ON CONFLICT documentationrevisado 2026-10-04 · verificado

¿Te ha resultado útil esta ficha?