2009-05-19 6 views
0

J'utilise la bibliothèque libpq en C pour accéder à ma base de données Postgresql. L'application insère une donnée provenant d'une file d'attente. Quand il y a beaucoup de données et qu'elles insèrent très rapidement, elles insèrent aléatoirement des lignes vides dans la table. Avant même d'effectuer l'insertion, je vérifie que la longueur du texte inséré est supérieure à un. Y a-t-il une raison pour que cela se passe au hasard? Cela n'arrive pas quand il y a moins de données.postgresql libpq insertion d'une ligne vide sans raison

* Je voudrais noter, que cela ne se produit pas sur Mysql, Postgresql seulement

+2

Ajoutez une contrainte de vérification à votre table, le cas échéant, et attendez l'erreur (inévitable) de la base de données. –

+0

Est-ce multi-thread? Utilisez-vous des appels pg asynchrones? Est-ce que vous réutilisez vos tampons d'entrée? –

Répondre

1

Voir A. Milen commentaire de Radev. Cela aurait dû être une réponse. Vous ne devez pas autoriser les lignes vides.

Sûrement qu'au moins une colonne peut avoir une contrainte qui provoquerait l'échec de l'insertion. Ensuite, votre application peut imprimer/enregistrer l'erreur avec suffisamment de diagnostics pour vous permettre de comprendre ce qui se passe, et dans quelles conditions. Sans modification ultérieure de ce qui précède, déterminez si toutes les données de votre file d'attente ont été insérées correctement ou si certaines lignes sont manquantes. C'est-à-dire, voir si certaines lignes sont en train d'être traduites en inserts vides. Si vous voyez que certaines données provoquent cela, vous pouvez trouver ce que les données de problème ont en commun.

Utilisez-vous des insertions paramétrées et préparées, ou créez-vous une chaîne d'instructions d'insertion SQL à chaque fois et exécutez-la? Si vous construisez des chaînes SQL à exécuter, alors vous devez assurez-vous de citer correctement les colonnes de caractères/chaînes binaires avec les routines fournies par libpq. Ou passez à l'autre méthode de préparation de l'insertion et de transmission des données en tant que paramètres où elle peut être correctement citée par libpq elle-même. Cela peut également améliorer les performances.

+0

Je construis les chaînes SQL à chaque fois et en cours d'exécution, j'utilise aussi la fonction d'échappement de chaîne fournie par libpq. Savez-vous s'il est possible d'ajouter une contrainte par programmation via libpq? – whatWhat

+0

C'est possible, mais vous pouvez mettre votre chapeau DBA et le faire en dehors de votre code. De toute façon, voir http://www.postgresql.org/docs/current/static/sql-altertable.html pour la syntaxe ALTER TABLE, qui fait souvent référence à http://www.postgresql.org/docs/current/static/ sql-createtable.html. Recherchez "contrainte" sur l'une ou l'autre page. – dwc

Questions connexes