0

私は、アップロードするマシンで CSV (所定の形式) を選択できるクライアント用のアップローダ (php を使用) をセットアップしています。CSV には 4000 ~ 5000 行が含まれる可能性があります。Php は、CSV の各行を読み取り、DB テーブルに直接挿入することで、ファイルを処理します。その部分は簡単です。

ただし、理想的には、このデータをデータベース テーブルに追加する前に、3 つの列 (A、B、および C) を確認し、それらの 3 つのフィールドの一致する組み合わせが既にテーブルにあるかどうかを確認します AND IFそのため、追加するのではなく、その行を更新したいと思います。これらの 3 つの列の一致する組み合わせがない場合は、先に進んで行を INSERT し、データをテーブルに追加します。

私の最初の考えは、列A、B、およびCをテーブルの一意のインデックスにしてから、すべての行を挿入し、「失敗した」INSERTを検出して(一意のインデックスの制限により)、更新を行うことができるということです。 . この方法は、テーブルに既に一致するコンボがあるかどうかを確認するためだけに、行ごとに個別の SELECT クエリを作成するよりも効率的であると思われます。

3 番目のアプローチは、MySQL の一意のインデックスを使用せずに単純に EVERYTHING を追加し、クライアントが後でそのテーブルをクエリするときに最新の一意の組み合わせのみを取得することです。ただし、そのテーブルに大量の無駄なデータが含まれないようにしています。

ベスト プラクティスや巧妙なアプローチについての考えはありますか?

4

2 に答える 2

1

( A、B、C ) 列に一意のインデックスを追加する場合、REPLACEを使用して 1 つのステートメントでこれを行うことができます。

REPLACE は INSERT とまったく同じように機能しますが、テーブル内の古い行が PRIMARY KEY または UNIQUE インデックスの新しい行と同じ値を持つ場合、新しい行が挿入される前に古い行が削除されます...

于 2010-12-10T15:31:09.303 に答える
1

3 つの列を一意の 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 マニュアルを参照してください。

于 2010-12-10T15:31:55.427 に答える