2009-05-19 13 views
0

Ich benutze die libpq-Bibliothek in C für den Zugriff auf meine Postgresql-Datenbank. Die Anwendung fügt ein Datenelement ein, das aus einer Warteschlange gespeist wird. Wenn viele Daten vorhanden sind und sehr schnell eingefügt werden, wird die Zeile zufällig eingefügt und in die Tabelle eingefügt. Bevor ich die Einfügung vornehme, überprüfe ich, ob die Länge des einzufügenden Textes größer als eins ist. Gibt es einen Grund, warum dies zufällig geschieht? Es passiert nicht, wenn weniger Daten vorhanden sind.postgresql libpq leere Zeile ohne Grund einfügen

* ich anmerken möchte, dass dies nicht auf Mysql passiert, Postgresql nur

+2

Fügen Sie Ihrer Tabelle ggf. Prüfbedingungen hinzu und warten Sie auf den (unvermeidlichen) Fehler in der Datenbank. –

+0

Ist das Multithreading? Verwenden Sie asynchrone PG-Aufrufe? Verwenden Sie Ihre Eingabepuffer erneut? –

Antwort

1

See Milen A. Radev Kommentar. Es sollte eine Antwort sein. Sie sollten keine leeren Zeilen zulassen.

Sicherlich kann mindestens eine Spalte eine Einschränkung haben, die dazu führen würde, dass die Einfügung fehlschlägt. Dann kann Ihre App den Fehler mit genügend Diagnose ausdrucken/protokollieren, damit Sie herausfinden können, was unter welchen Bedingungen vor sich geht.

Ohne die oben genannten Nachrüstungen zu überprüfen, ob alle Daten aus der Warteschlange ordnungsgemäß eingefügt wurden oder ob einige Zeilen fehlen. D. h., Ob einige Zeilen in leere Einfügungen übersetzt werden. Wenn Sie sehen, dass einige Daten dies verursachen, können Sie herausfinden, was die Problemdaten gemeinsam haben.

Verwenden Sie vorbereitete, parametrisierte Einfügungen oder erstellen Sie jedes Mal eine SQL-Einfügeanweisungszeichenfolge und führen Sie diese aus? Wenn Sie SQL-Strings zum Ausführen erstellen, müssen Sie müssen stellen Sie sicher, dass Sie Zeichen/Binär-String-Spalten ordnungsgemäß mit den Routinen von libpq angegeben. Oder wechseln Sie zu der anderen Methode zum Vorbereiten der Einfügung und übergeben Sie die Daten als Parameter, wo sie von libpq selbst korrekt zitiert werden kann. Dies kann auch die Leistung verbessern.

+0

Ich baue die SQL-Strings jedes Mal und ausführend, ich benutze auch die String-Escaping-Funktion von libpq zur Verfügung gestellt. Weißt du, ob es möglich ist, eine Einschränkung über libpq programmatisch hinzuzufügen? – whatWhat

+0

Es ist möglich, aber Sie möchten vielleicht Ihren DBA-Hut aufsetzen und es außerhalb Ihres Codes tun. Wie auch immer, siehe http://www.postgresql.org/docs/current/static/sql-altertable.html für die ALTER TABLE-Syntax, die sich häufig auf http://www.postgresql.org/docs/current/static/ bezieht. sql-createtable.html. Suchen Sie auf beiden Seiten nach "constraint". – dwc