Mysql
 sql >> Base de données >  >> RDS >> Mysql

Utilisation de libpqxx pour stocker des données en masse OU comment utiliser l'instruction COPY dans libpqxx

Le pushLog la fonction valide chaque insertion séparément et la validation est lente.

Comme expliqué dans la documentation Remplir une base de données :

Aussi :

Dans votre cas cependant, ce serait un problème plutôt qu'un avantage, car chaque INSERT peut échouer en cas de violation de la clé primaire, annulant ainsi les INSERT précédents depuis le dernier commit. Notez que ce serait également un problème avec COPY , devriez-vous l'utiliser.

Puisqu'il est vraiment nécessaire de regrouper les requêtes dans les transactions pour des raisons de performances, vous devez gérer les violations de clé primaire de manière à ne pas interrompre la transaction.

Deux méthodes sont généralement utilisées :

  1. Évitez l'erreur :INSERT INTO... WHERE NOT EXISTS (SELECT 1 FROM table WHERE primary_key=...)

  2. Interceptez l'erreur en insérant à l'intérieur d'une fonction plpgsql qui a un bloc EXCEPTION ignorant itr. Les INSERT(s) spécifiques provoquant un doublon seront annulés mais la transaction ne sera pas abandonnée.

Si vous avez des insertions simultanées, ces méthodes doivent être affinées avec une stratégie de verrouillage.