PostgreSQL: duplicate key value violates unique constraint

Posted on Actualizado enn

A veces podemos encontrarnos con que, al introducir una entrada nueva en una tabla de PostgreSQL nos dé el error duplicate key value violates unique constraint. Voy a explicarte qué significa, porque pasa esto y cómo solucionarlo.

¿Qué significa este error?

Este error nos está indicando que estamos violando la propiedad de valor único de una clave primaria.

¿Por qué ocurre esto?

Si trabajas con Django sabrás que para cada modelo se crea una tabla con un identificador propio único, que suele ser la clave primaria y suele ser autonumérica. Si no utilizas Django, también es un tipo de clave que se suele utilizar con frecuencia. En cualquier caso, PostgreSQL guarda la secuencia relacionada con la clave primaria de nuestras tablas en un contador a parte. A veces puede ocurrir que esta secuencia y la numeración automática de dicha clave se hayan desincronizado, causando ese mensaje de error cada vez que queramos introducir una fila nueva.

Podemos detectar si es ese nuestro problema con los siguientes comandos:

SELECT MAX(clave_primaria) FROM nuestra_tabla;   
SELECT nextval('secuencia_de_clave_primaria');

El primer comando nos dará la el valor más alto de nuestra clave primaria. El segundo nos dirá el valor del contador de secuencia de dicha clave primaria. Quizá no sepas cómo se llama la secuencia de nuestra clave primaria. Para eso tienes el siguiente comando:

SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';

Este comando te dirá el nombre de dicha secuencia. Una vez lo tengas y hagas ejecutado los dos comandos anteriores, comprueba que concuerdan. Si el resultado del primer comando es mayor que el del segundo, confirmará que tienes el problema de la desincronización.

¿Cómo lo soluciono?

Solucionarlo es muy sencillo, pero primero recuerda, crea siempre una copia de seguridad de tu base de datos por si algo no saliera bien.

Lo que vamos a hacer es actualizar la secuencia con el siguiente valor correcto según el valor más alto que tengamos en nuestra clave primaria, es decir, el resultado del primer comando. Para ello ejecuta el siguiente comando:

SELECT setval('secuencia_de_clave_primaria', (SELECT MAX(clave_primaria) FROM nuestra_tabla)+1);

¡Listo! Ahora ya podrás realizar entradas nuevas en la tabla en la que te daba el error.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.