web-dev-qa-db-fra.com

Restauration à partir de pg_dump avec des contraintes de clé étrangère

Lors de la restauration d'une base de données à partir d'un pg_dump, un certain nombre d'erreurs sont générées et la table entière est ensuite ignorée. Un exemple:

ERROR:  insert or update on table "channelproducts" violates foreign key constraint "fk_Rails_dfaae373a5"
DETAIL:  Key (channel_id)=(1) is not present in table "channels".

Chose intéressante, j'ai remarqué que toutes ces instances apparaissent en raison de la séquence de chargement. channels est après channelproducts à la fois par ordre alphabétique et dans le fichier et je peux donc comprendre pourquoi postgres se plaint d'avoir à créer un enfant sans parent.

mise en garde: la clé étrangère est générée automatiquement par Rails 4.2: je pourrais supprimer le problème à la source mais cela ne résout toujours pas vraiment le problème ...

version: PostgreSQL 9.4.4.

Comment puis-je restaurer à partir de psql avec des cas de contraintes de clé étrangère, si les tables et colonnes de la base de données sont déjà créées?

9
Jerome

Vous pouvez mettre SET session_replication_role = replica;en haut de votre fichier SQL. Cela ignorera les contraintes lors de l'insertion des données Comme le paramètre est basé sur la session, les contraintes continueront de fonctionner en dehors de ce script.

Mais attention: si vous créez des données incohérentes alors que ce paramètre est actif, postgres les conservera. Les contraintes ne sont vérifiées qu'au moment de l'insertion/mise à jour.

Voir https://www.endpoint.com/blog/2015/01/28/postgres-sessionreplication-role pour une discussion plus approfondie des avantages et des inconvénients de cette approche.

6
achimh

Essayez de créer une nouvelle base de données avec une table vide avec et restaurer la base de données. Le problème peut probablement être lié à la relation existante entre les tables.

0
Suman Astani