0

MySQLにCSVインポートがあり、最初の重複エントリエラーが発生した後、MySQLにインポートする前に重複をチェックする機能を探しています。

私は走っていColdfusion8, MySQL5.0.88ます。

私のインポートは、実際にメインデータベースにコミットする前に、最初に中間テーブル(import_pricat_csv)に入ります。中間テーブルに入力するとき、私はすべてのインポート検証を次のように実行しています。

 <cfquery datasource="db">
    UPDATE import_pricat_csv
    SET error= "true", errorMsg= "invalid EAN"
    WHERE iln = <cfqueryparam value = "#Session.loginID#" cfsqltype="cf_sql_varchar" maxlength="13"> 
    AND error= "no" 
    AND (ean is null OR NOT (ean REGEXP '[0-9]{13}' OR ean REGEXP '[0-9]{12}'))
 </cfquery>

これにより、import_pricatがデータベースにコミットされる前に、エラーがないかチェックされます。MySQLにアクセスできることはわかってINSERT IGNOREいますが、インポートエラーレポートを作成するには、このようにする必要があります。

eanインポートするがすでに実際のデータベーステーブルにあるかどうかを確認するルールを追加する必要がありますproducts

私はこれを試していますが、機能しません:

<cfquery datasource="db">
    UPDATE import_pricat_csv
    SET error= "yes", errorMsg= "duplicate EAN"
    WHERE iln = <cfqueryparam value = "#Session.loginID#" cfsqltype="cf_sql_varchar" maxlength="13"> 
        AND error= "no" 
        AND ean IN (SELECT p.ean FROM products AS p WHERE p.ean = ean )
</cfquery>

私が間違っていることについて何か考えはありますか?

ありがとう!

4

1 に答える 1

4

私は個人的LOAD DATA FROM FILEにCSVデータを一時的な(そして同一の)テーブルにインポートするために使用します。次に、この一時テーブル内のすべての新しいデータを使用して、これに対してクエリを実行し、「マスター」と比較して、値が存在するかどうかを判断できます。

<cfquery name="qLoadTempData" datasource="xyz">
  LOAD DATA LOCAL INFILE 'abc.csv'
  INTO TABLE 'temp_table_name'
  [rest of the query]
</cfquery>

<cfquery name="qCheckExisting" datasource="xyz">
  SELECT x, y, z
  FROM temp_table AS a 
  WHERE
    a.ean NOT EXISTS (SELECT 1 FROM main_table AS b WHERE b.ean = a.ean)
</cfquery>

<cfloop query="qCheckExisting">
  <!--- All the ean's that are not in the main table --->
  <!--- now insert into the main table --->
</cfloop>

<!--- Empty out the temp table ready for next import --->

これで覚えておくべき唯一の小さなことは、CSVファイルが正しくフォーマットされていない場合、どのデータも一時テーブルにインポートされないということです。ただし、CSVファイルをインポートする方法ははるかに高速です。

于 2012-10-01T12:27:54.593 に答える