Suite à une copie et restauration d’une base ou à une quelconque autre opération, il peut arriver que les séquences des id primaires des tables ne soient plus synchronisées.

Vous vous retrouvez alors avec un joli message d’erreur à la moindre insertion sur une table, du genre :

1
2
 IntegrityError: duplicate key value violates unique constraint "tablename_pkey"
DETAIL:  Key (id)=(6435) already exists.

Pas de panique, il vous suffit juste d’exécuter cette requête sur la table qui pose problème :

1
SELECT setval ('tablename_id_seq', (SELECT MAX(id) FROM))

tablename est le nom de votre table et id le nom de la colonne représentant l’identifiant primaire.

Cette commande permet de positionner la valeur actuelle de la séquence, à celle du dernier id enregistré. Le prochain enregistrement aura donc pour id Max(id)+1, valeur qui ne sera pas encore utilisée et ne posera donc pas de problème.

Dans le cas où vous avez plusieurs tables qui ont ce problème, le mieux ce serait de mettre ce script dans une boucle.

Et Hop! un casse-têtes en moins 🙂