2016-05-11 4 views
0

私は2つのデータベースファイル、メインと新しいデータベースがあるとします。新しいデータベースファイルがリリースされるたびに、ユーザーは新しいデータベースからメインデータベースを更新する必要があります。SQLite c# - プライマリまたはユニークキーのないINSERTまたはUPDATE

  1. 特定の行が見つかった場合など。 CustomerNameが同じであれば、 メインデータベースの古いレコードを更新する必要があります。
  2. 見つからない場合は、メインデータベースに新しいレコードを挿入する必要があります。

私が試みたのは、新しいデータベースからすべての行を選択し、次にreader.Read()を使用して行単位で移動することでした。ループ内で、update sqlが-1を返すかどうかを確認してから、insert sqlを実行します。

上記のアプローチは、更新または挿入を実行するためにすべての行を通過する必要があるため、パフォーマンスの問題がありました。私の提案する解決策は、メインデータベースに新しいデータベースを添付し、 "INSERTまたはREPLACE table SELECT * FROM newdatabase.table"を実行することです。

しかし、すぐに私は問題を認識しました。私は実際にテーブルにプライマリキーを持っていない、またはプライマリキーはINSERTまたはREPLACEを決定するのに役立たない。これは特定の顧客要件のためです。この場合、主キーなしでINSERTまたはREPLACEを使用することはできません。比較する列(CustomerName)が一意のキーまたは主キーではありません。

もっと良い解決策があれば教えてください、ありがとうございます!そして付属のデータベースを使用して - - 欠落行を挿入するための

+0

ストアドプロシージャを使用できますか? – logixologist

+0

残念ながらsqliteにはストアドプロシージャがありません:( –

+0

あなたのテーブルには、ほとんどの場合常にプライマリキーが必要です(特に挿入したい場合)(http://stackoverflow.com/questions/831850/should-a-databaseキーを持っていることを確認してください) –

答えて

-1

あなたはこのような何かを行うことができます:

COL2を選択する表1(COL2、COL3、...)に挿入、COL3、...
からnewdatabase.Table1ここではカスタム名がありません(Table1のcustomernameを選択してください)

これは、col1が1次自動増分IDであることを前提としています。このcol1以外のすべての列に名前を付ける必要があります。更新については、同様の更新コマンドを 'customer name in'で実行します。

関連する問題