2010-06-17 8 views
1

J'ai récemment créé un vidage SQL d'une base de données derrière un projet Django, et après avoir nettoyé le SQL un peu pu restaurer la base de données et toutes les données. Le problème était que les séquences étaient tout mucked up. J'ai essayé d'ajouter un nouvel utilisateur et généré l'erreur Python IntegrityError: duplicate key violates unique constraint.Un vidage Postgresql crée-t-il des séquences qui commencent par ou après la dernière touche?

Naturellement j'ai pensé que mon vidage SQL n'a pas redémarré la séquence. Mais il l'a fait:

DROP SEQUENCE "auth_user_id_seq" CASCADE; 
CREATE SEQUENCE "auth_user_id_seq" INCREMENT 1 START 446 MAXVALUE 9223372036854775807 MINVALUE 1 CACHE 1; 
ALTER TABLE "auth_user_id_seq" OWNER TO "db_user"; 

je me suis dit qu'une tentative répétée à la création d'un utilisateur (ou une nouvelle ligne dans une table avec les données existantes et une telle séquence) autorisés pour objet/création de la ligne réussie. Cela a résolu le problème pressant. Mais étant donné que le dernier ID utilisateur dans cette table était 446 - la même valeur de départ dans la création de la séquence ci-dessus - il semble que Postgresql essayait simplement de commencer à créer des lignes avec cette clé.

Le vidage SQL fournit-il la mauvaise clé de démarrage de 1? Ou devrais-je appeler une autre commande pour démarrer des séquences après l'ID de début donné? Très curieux.

+0

Question de suivi ajoutée: http://stackoverflow.com/questions/3168187/django-orm-misreading-postgresql-sequences – bennylope

Répondre

3

La décharge est bien, pas de problème. Si votre code (ou la valeur par défaut de la colonne) utilise nextval() pour obtenir la valeur suivante de la séquence, tout ira bien aussi. Vérifiez votre code et voyez ce qu'il fait, quel SQL est exécuté. Avec cette information, vous pouvez voir pourquoi les choses vont mal.

Bonne chance!

+0

+1 Postgresql n'a aucun problème avec ce scénario. Vous pouvez vérifier manuellement que votre dernier identifiant dans votre table n'est pas supérieur à la valeur de séquence actuelle. – leonbloy

+0

Je suppose que j'ai été en mesure de forcer cela à «effacer» indique qu'il s'agit d'un problème Django, pas un problème Postgresql. (Ajouter des tags add'l) – bennylope

+0

Je suis de retour à penser qu'il y a une erreur du côté de Postgres. Après avoir à nouveau déposé la base de données et restauré, j'ai remarqué les mêmes problèmes dans Django. Cette fois, j'ai essayé de sélectionner nextval à partir d'une séquence et j'ai obtenu la valeur actuelle de l'ID max dans ce champ. L'appel suivant à nextval(), par ex. 'SELECT nextval ('sequence');' a incrémenté la séquence. C'est cet appel initial qui ne l'est pas. Si ce n'est pas une erreur dans Postgres 8.1 alors son comportement certainement inattendu pour moi! Référé par cette réponse http://stackoverflow.com/questions/3168187/django-orm-misreading-postgresql-sequences/3176972#3176972 – bennylope