2017-06-14 1 views
0

J'ai trouvé un bug drôle important un fichier de vidage de postgresql avec psql:Dans sauvegarde/restauration PostgreSQL, des séquences supplémentaires d'auto dupliquer contrainte de violation

Dans le cas si votre table a une sequence(auto increment field), par exemple avant nextValue l'importation de la séquence a été 10, après l'importation, nous ajoutons 100 lignes et logiquement nextvalue doit être 111. Mais il est toujours 11, et bien sûr vous aurez une violation de contrainte sur l'insertion suivante.

La solution:

  1. obtenir la prochaine valeur actuelle avec un select nextval('xxx_seq')
  2. select max(xxx_id) from yyyy

Il est de vous donner la valeur actuelle max id autoincrement.

Maintenant, nous devons définir la valeur suivante à 2) + 1:

SELECT setval('xxx_seq', n+1, true) 

Dump dans un fichier:

pg_dump --data-only -h host -p port -U username -a dbname > outputfilename 

Restauration de la décharge:

psql -h host -U username dbname < outputfilename 

J'utilise la version db 9.5.5.

+0

1. Bon début. 2. Notez qu'il serait important de rendre votre question aussi compréhensible que possible. Le formatage est important. La grammaire est également importante. 3. S'il vous plaît, divisez votre message en un formulaire de questions/réponses. C'est nécessaire car en lisant votre post, les googleurs du futur veulent ici une question. – peterh

Répondre

0

TL; DR: ce n'est pas un bug.

Les tables sont liées aux séquences par le fait que les colonnes peuvent avoir nextval(sequence_name) comme valeur par défaut.

Une clause par défaut signifie que lorsque la valeur est déjà fournie par l'INSERT ou une COPY, cette expression nextval(...) n'est pas évaluée et la séquence n'est pas incrémentée. C'est ce qui se passe quand vous jouez une décharge.

Dans le cas général, ces colonnes sont créées sous la forme SERIAL et les fichiers de vidage contiennent setval des séquences correspondantes pour les ajuster après la charge. Votre cas diffère dans la façon dont vous avez créé les tables ou les options qui ont été passées à pg_dump, mais ces détails n'apparaissent pas dans la question.

0

ok, quelle est la bonne façon de créer un "fichier de vidage normal" comme dans mssql ou oracle, je veux importer des données et ne pas rompre les séquences et insérer des instructions?