2010-12-10 12 views
0

アップロードするマシン上でCSVを(事前に決められた形式で)選択できるクライアントのアップローダー(phpを使用)を設定しています。 CSVはおそらく4000〜5000の行を持ちます。 phpは、CSVの各行を読み込んでDBテーブルに直接挿入することでファイルを処理します。その部分は簡単です。MySQLに重ね書き/追加バッチ書き込みを混在させることはできますか?

ただし、理想的には、このデータをデータベーステーブルに追加する前に、3つの列(A、B、C)を確認し、これら3つのフィールドの一致するコンボが既にあるかどうかを確認します私はむしろ追加するよりむしろその行を更新したいと思います。これらの3つの列の一致するコンボがない場合は、行を挿入してデータをテーブルに追加します。

私の最初の考えは、列A、B、Cをテーブル内のユニークなインデックスにしてから、すべての行をINSERTし、INSERT(独自のインデックスの制約のため)を検出して、更新を行います。このメソッドは、テーブル内に既に一致するコンボがあるかどうかを確認するために、各行に対して個別のSELECTクエリを作成する必要がある場合よりも効率的であると考えられます。

3つ目のアプローチは、MySQLユニークインデックスを使用せずに単にEVERYTHINGを追加し、クライアントが後でそのテーブルをクエリするときに最新の一意のコンボだけを取得することです。しかし、私はそのテーブルに大量の無駄なデータがあるのを避けようとしています。

ベストプラクティスまたは賢明なアプローチについての考え方はありますか?

答えて

1

あなたが作る場合3列のun ique idでは、ON DUPLICATE KEYでINSERTを実行できます。

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 manualでこの便利なテクニックの詳細を読むことができます。

+0

非常に便利なテクニック。 – phirschybar

+0

うれしい私は助けることができます。これは私が拾った便利なトリックです。 –

1

あなたは(A、B、C)の列に一意索引を追加する場合は、あなたが1つのステートメントでこれを行うにはREPLACEを使用することができます。

かのことを除いて正確にINSERT、 のような作品をREPLACEテーブル の古い行が PRIMARY KEYまたはUNIQUEインデックスの新しい行と同じ値を持つ新しい行が挿入 である前に、古い 行が削除されます...

+0

これはON DUPLICATEと同様に機能します。ありがとう。 – phirschybar

関連する問題