0

ファイル (csv) からデータベースに新しい製品を更新または挿入する際の問題を解決しようとしています。

問題は、CSV ファイルに製品の番号とサプライヤーしかないことです。したがって、すべての製品で、このサプライヤーと番号を使用して ID を探す必要があります。製品が見つからない場合は、新しい製品を挿入する必要があります。それ以外の場合は、保管情報と価格を更新するだけです。

その csv には 500,000 個の製品 (34MB) があります。

今、私は次のようなコードでこれを解決しています (ただし、メモリ領域がないため (2GB を使用)、スクリプトは 50 000 ファイル行で停止します:

        while (!feof($file_handle)) 
    {   
        $data = fgetcsv($file_handle,5096,$i->column_separator);

        if($row >= ($i->firstrow-1) && !empty($data[$i->column_product_code-1]) && !empty($data[$i->column_product_name-1]) && !empty($data[$i->column_price-1]) && $data[$i->column_price-1] > 0)
        {                            
            @$code = str_replace(array(' ','.','-','/'),'',$data[$i->column_product_code-1]);
            @$supplier = iconv('WINDOWS-1250','UTF-8', $data[$i->column_producer_name-1]);
            @$name = iconv('WINDOWS-1250','UTF-8', $data[$i->column_product_name-1]);

            $article = $articleModel->searchImport($code,$supplier,isset($data[$i->column_producer_code-1]) ? $data[$i->column_producer_code-1]:NULL);

            if($article !== FALSE)
            {
                $importqueueModel->update()
            }
            else
            { 
                $importqueueModel->insert()
            }

ファイルから製品コードとサプライヤーを一致させてデータベースからIDを取得する方法がわかりません。これにより、新しい製品をデータベースに更新または挿入できます。

助けてください、どんなヒントでも大歓迎です。

ありがとうございました

4

3 に答える 3

3

一般的な経験則として、スクリプトで何百ものクエリを実行する必要があると思われる場合は、それは間違っています。数千?大きな過ち。

ライブ データが既に含まれているターゲット テーブルに CSV からデータを直接読み込まないでください。ステージング テーブルに読み込みます。その後、単一の挿入....選択により、関連するレコードが入力されます。

INSERT INTO suppliers (name, status)
SELECT c.supplier, 'new'
FROM csv_imported c
LEFT JOIN suppliers s
ON c.supplier=s.name
WHERE s.name is NULL
AND c.supplier IS NOT NULL;

また、mysqlimport / load data infile を使用すると、多くのコードも必要なくなります。

メモリ容量がないため(2GB使用)

間違った方法で実行しても、この問題は発生しません。コードにバグがあります。

于 2012-11-21T00:12:34.343 に答える
0

コードのどこかに、CSV ファイルから読み取った各行に関するデータを保存しています。$articleModel->searchImport()これは、メソッド呼び出しの一部でない限り、投稿した不完全なスニペットには含まれていないようです。

運が良ければ、投稿から省略したエラー/例外メッセージが問題の行を直接指している可能性があります。

于 2012-11-20T23:57:19.983 に答える
0

$importQueueModelMySQL 拡張 INSERT 構文をサポートする新しいメソッドを に追加できますON DUPLICATE UPDATE。これは移植可能ではありませんが、現在の問題を解決します。

別の (より良い) 解決策は、更新を処理する MySQL スクリプトを作成することです。PHP スクリプトを変更して SQL を出力し、それを個別に実行することができます。

INSERTリファレンス マニュアル。

于 2012-11-21T00:02:36.007 に答える