0

我有一个 CSV 导入 MySQL,在收到我的第一个重复输入错误后,我正在寻找一些功能来检查在导入 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 被提交到数据库之前检查它是否存在错误。我知道我可以INSERT IGNORE进入 MySQL,但我需要这样做才能创建导入错误报告。

我需要添加一个规则来检查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 回答