2009-05-19 28 views
0

私はPostgresqlデータベースにアクセスするためにC言語でlibpqライブラリを使用しています。アプリケーションは、キューから供給されたデータを挿入します。多くのデータがあり、それが非常に迅速に挿入されている場合、テーブルにランダムに行が挿入され、空の行が挿入されます。挿入を実行する前に、挿入されるテキストの長さが1より大きいかどうかをチェックします。これがランダムに起こっている理由はありますか?データが少ないときは起こりません。postgresql libpq無理由で空行を挿入する

*私は、これは、MySQL、Postgresqlの唯一

+2

必要に応じてテーブルにチェック制約を追加し、DBからの(必然的な)エラーを待ちます。 –

+0

これはマルチスレッドですか?非同期呼び出しを使用していますか?入力バッファを再利用していますか? –

答えて

1

参照Milen A.ラデフさんのコメントに起こらないよう、注意したいと思います。それは答えだったはずです。空の行を許可しないでください。

少なくとも1つの列には、挿入が失敗するような制約があります。次に、あなたのアプリケーションは、何が起こっているのか、どのような状況下であるのかを把握するのに十分な診断でエラーを印刷/記録できます。

上記を改訂せずに、キューからすべてのデータが正しく挿入されたかどうか、または行が欠落しているかどうかを判断してください。つまり、いくつかの行が空の挿入に変換されているかどうかを確認します。一部のデータが原因でこの問題が発生している場合は、問題のデータに共通するものを見つけることができます。

準備されたパラメータ化された挿入を使用しているか、毎回SQL挿入文を作成し実行していますか?実行するSQL文字列を構築する場合は、でなければなりません。文字/バイナリ文字列をlibpqが提供するルーチンで適切に引用していることを確認してください。あるいは、インサートを準備し、データをパラメータとして渡す他の方法に切り替えることができます。ここで、libpq自身が適切に引用することができます。これにより、パフォーマンスも向上する可能性があります。

+0

私は毎回SQL文字列を作成して実行していますが、libpqが提供する文字列エスケープ機能も使用しています。プログラムでlibpq経由で制約を追加することが可能かどうか知っていますか? – whatWhat

+0

これは可能ですが、DBAハットを置いてコードの外側に置いてください。どちらの方法でも、http://www.postgresql.org/docs/current/static/を参照するALTER TABLE構文については、http://www.postgresql.org/docs/current/static/sql-altertable.htmlを参照してください。 sql-createtable.html。どちらか/両方のページで "constraint"を検索してください。 – dwc

関連する問題