- Software y sistemas
- Base de datos
23505
PostgreSQL 23505 unique_violation: clave duplicada en una tabla
Evidencia vinculada a esta decisión
Ver fuente: PostgreSQL current error codes appendixNivel 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.
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.
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.
Nombre de la restricción en el error
- 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
Definición de la restricción
- 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
Fila que ya tiene el valor
- 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
Secuencia frente al máximo de la columna
- 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
PostgreSQL current error codes appendix
PostgreSQL Global Development Group · 2026 · official_doc
- 2
PostgreSQL current INSERT and ON CONFLICT documentation
PostgreSQL Global Development Group · 2026 · official_doc
¿Te ha resultado útil esta ficha?