LOAD DATA LOCAL INFILE查询

时间:2013-03-13 05:33:46

标签: mysql sql

我有,

<pre lang="SQL">LOAD DATA LOCAL INFILE 'C:\Users\mydesk\Desktop\dcc.csv' INTO TABLE DATAS.TABLE IN FIELDS TERMINATED BY ',' ENCLOSED BY '"' lines terminated by '\n'</pre>

在我的程序中查询,将数据从csv文件上传到mysql。但是在某些行中会出现&#34; PRIMARY KEY重复条目&#34; 错误。如何在每一行中捕获这些异常并处理不同的查询?

例如,我在csv文件中有10行,有些行与DATAS.TABLE中的行相同。因此,当这些记录插入到表DATAS.TABLE中时,我需要执行更新查询。

3 个答案:

答案 0 :(得分:1)

可以建议在第一遍中将数据从csv加载到临时表。

然后使用此临时表分两步处理数据:(1)更新临时表中的现有行;(2)在第二遍中从临时表中插入新行。

答案 1 :(得分:1)

来自MySQL doc

  

REPLACE和IGNORE关键字控制输入行的处理   复制唯一键值上的现有行:

     

如果指定REPLACE,则输入行将替换现有行。其他   单词,主键或唯一索引具有相同值的行   作为现有的行。请参见第13.2.7节“REPLACE语法”。

     

如果指定IGNORE,则输入复制a上现有行的行   跳过唯一键值。如果您未指定任一选项,则   行为取决于是否指定了LOCAL关键字。没有   LOCAL,当找到重复的键值时发生错误,并且   其余的文本文件被忽略。使用LOCAL,默认行为是   就像指定了IGNORE一样;这是因为服务器没有   在操作过程中停止传输文件的方法。

因此,如果您需要更新重复值的行,请在查询中提及 REPLACE

答案 2 :(得分:1)

我建议

  1. 创建没有约束的临时表
  2. 首先将数据加载到该表中
  3. 清理,清理,验证(包括消除PK中的重复项),转换数据
  4. 将干净的数据插入您的事实表格
  5. truncate staging table
  6. 使用该方法,您可以执行多步复杂验证,与参考表和/或事实表联接以查找不一致或其他问题。

    在这种情况下,查找重复项只是在临时表上进行简单的SELECT。