混合オーバーライト /付録バッチ書き込みをmysqlに入れることができますか?

StackOverflow https://stackoverflow.com/questions/4410368

  •  08-10-2019
  •  | 
  •  

質問

クライアントにアップロード(PHPを使用)を設定して、マシンでCSV(事前に決定された形式)を選択してアップロードします。 CSVには4000〜5000行の行があります。 PHPは、CSVの各行を読み取り、DBテーブルに直接挿入することにより、ファイルを処理します。その部分は簡単です。

ただし、理想的にはこのデータをデータベーステーブルに追加する前に、3つの列(a、b、c)の3つを確認し、テーブル内のこれらの3つのフィールドの一致するコンボが既にあるかどうかを確認します。そのため、追加するのではなく、その行を更新したいです。これらの3つの列の一致するコンボがない場合は、先に進み、行を挿入して、データをテーブルに追加します。

私の最初の考えは、列A、B、およびCをテーブルに一意のインデックスを作成し、すべての行を挿入し、何らかの方法で「失敗した」挿入を検出してから、何らかの方法で更新を行うことができるということです。 。この方法は、各行に個別の選択クエリを作成するよりも効率的であるように思われます。

3番目のアプローチは、MySQL一意のインデックスを使用しないで、すべてを単に追加して、クライアントが後でそのテーブルを照会したときにのみ最新の一意のコンボをつかむことです。しかし、私はそのテーブルに大量の役に立たないデータを持っていることを避けようとしています。

ベストプラクティスや賢いアプローチについての考え?

役に立ちましたか?

解決

3列を一意のIDにした場合、重複キーを含む挿入を実行できます。

INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7)
  ON DUPLICATE KEY UPDATE d=5,e=6,f=7;

この便利なテクニックの詳細については、 mysqlマニュアル.

他のヒント

(a、b、c)列に一意のインデックスを追加すると、使用できます 交換 これを1つのステートメントで行うには:

Tableの古い行がプライマリキーまたは一意のインデックスの新しい行と同じ値を持っている場合、新しい行が挿入される前に古い行が削除されることを除いて、挿入とまったく同じように交換します...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top