Assumer cette simple requête SQL:Ignorer les erreurs d'insertion par lots Postgresql
INSERT INTO table (col1,col2) VALUES (val1,val2),(val3,val4),(val5,val6);
Disons que val3
est valeur non valide pour col1
. Cela provoquerait l'abandon de toute commande INSERT par psql - il n'insérerait pas (val1,val2)
ni (val5,val6)
non plus.
Est-il possible de faire postgresql ignorer cette erreur afin qu'il n'insère pas (val3,val4)
paire, mais serait toujours procéder à (val1,val2)
et (val5,val6)
?
Je reçois tous les jours dumps base de données dans des fichiers texte de mon partenaire (ne peut pas changer cela), que j'utilise pour faire ma copie. Parfois, ses énormes requêtes INSERT provoquent des erreurs telles que:
ERROR: invalid byte sequence for encoding "UTF8": 0x00
... ce qui rend les valeurs entières de 30000+ pas insérés à la table, parce que l'une de ces valeurs est faux.
btw. Une solution que j'ai trouvée est l'analyse de ce fichier texte et la modification de toutes les commandes batch INSERT à plusieurs commandes à valeur unique. Mais avant que j'implémente ça - peut-être que vous avez trouvé une meilleure solution. – grzaks
Vous seriez probablement bien mieux en utilisant l'instruction COPY au lieu d'un gros insert. – Pointy
En outre, comment ces fichiers sont-ils préparés? ** Pourquoi ** existe-t-il des séquences d'octets illégales? – Pointy