2010-10-06 4 views
1

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.

+0

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

+0

Vous seriez probablement bien mieux en utilisant l'instruction COPY au lieu d'un gros insert. – Pointy

+0

En outre, comment ces fichiers sont-ils préparés? ** Pourquoi ** existe-t-il des séquences d'octets illégales? – Pointy

Répondre

1

L'application qui traite le fichier d'entrée doit envelopper chaque instruction INSERT avec un point de sauvegarde. Si l'insertion échoue, elle peut être restaurée au dernier point de sauvegarde. Quelque chose comme:

(code pseudo)

 
foreach line 
    set savepoint 
    try 
    insert current line 
    catch 
    rollback to savepoint 
    end 
endloop 
commit