0

私は持っている、

<pre lang="SQL">LOAD DATA LOCAL INFILE 'C:\Users\mydesk\Desktop\dcc.csv' INTO TABLE DATAS.TABLE IN FIELDS TERMINATED BY ',' ENCLOSED BY '"' lines terminated by '\n'</pre>

プログラムでクエリを実行して、csv ファイルから mysql にデータをアップロードします。ただし、一部の行で「PRIMARY KEY のエントリが重複しています」というエラーが発生します。各行でこれらの例外をキャッチし、異なるクエリで処理するにはどうすればよいですか?

たとえば、csv ファイルに 10 行あり、一部の行は と同じDATAS.TABLEです。したがって、そのようなレコードがテーブルに挿入される場合はDATAS.TABLE、代わりに更新クエリを実行する必要があります。

4

3 に答える 3

1

私は提案します

  1. 制約なしでステージングテーブルを作成する
  2. 最初にそのテーブルにデータをロードします
  3. クリーンアップ、サニタイズ、検証(PKの重複の排除を含む)、データの変換
  4. ファクトテーブルにクリーンなデータを挿入します
  5. ステージングテーブルを切り捨てます

このアプローチを使用すると、マルチステップの複雑な検証を実行し、参照テーブルやファクトテーブルと結合して、不整合やその他の問題を見つけることができます。

その場合、重複を見つけることは、ステージングテーブルでの単純なSELECTの問題です。

于 2013-03-13T05:54:25.153 に答える
1

最初のパスでcsvから一時テーブルにデータをロードすることを提案できます。

次に、この一時テーブルを使用して、(1) 一時テーブルから既存の行を更新し、(2) 2 番目のパスで一時テーブルから新しい行を挿入する 2 つの手順でデータを処理します。

于 2013-03-13T05:38:57.303 に答える
1

MySQLドキュメントから:

REPLACE および IGNORE キーワードは、一意のキー値で既存の行を複製する入力行の処理を制御します。

REPLACE を指定すると、入力行によって既存の行が置き換えられます。つまり、主キーまたは一意のインデックスの値が既存の行と同じである行です。セクション13.2.7「REPLACE 構文」を参照してください。

IGNORE を指定すると、一意のキー値で既存の行と重複する入力行はスキップされます。どちらのオプションも指定しない場合、動作は LOCAL キーワードが指定されているかどうかによって異なります。LOCAL を指定しないと、重複するキー値が見つかったときにエラーが発生し、テキスト ファイルの残りの部分は無視されます。LOCAL を指定すると、デフォルトの動作は IGNORE を指定した場合と同じになります。これは、サーバーが操作の途中でファイルの送信を停止する方法がないためです。

したがって、重複する値の行を更新する必要がある場合は、クエリでREPLACEを指定してください。

于 2013-03-13T05:43:07.487 に答える