Mysql加载文件

时间:2014-08-11 19:30:33

标签: mysql

我有一个CSV文件,其中包含Mysql DB表中每行的一行;每行有3个值。前两个直接对应于DB表的列,因此可以通过。第三个值包含一个代码,该代码将用作“查找”代码到另一个DB表中,而该表中的另一个列(1:1关系)将被加载到第一个表中。所以:

  • 表1:包含ColA,ColB,ColC
  • 表2:包含LookupCode,LookupValue

CSV文件包含(每行)ColA,ColB,LookupCode

我想通过CSV文件加载到Table1中的是:ColA,ColB,LookupValue FROM Table2,基于CSV文件行第3列中的LookupCode。

我的问题是:我该怎么做?

我尝试了以下形式的LOAD DATA语句:

LOAD DATA LOCAL INFILE 'path to CSV file' INTO TABLE Table1
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(ColA, ColB, @Lookup)
SET ColC = (SELECT LookupValue FROM Table2 WHERE LookupCode = @Lookup LIMIT 1);

但是这导致每个加载行中的ColC为NULL(ColA和ColB很好)。

如果我使用固定代码而不是@Lookup,例如LookupCode ='code1'它将访问Table2并在每个加载的行的ColC中填充(相同的)相应列值value1,因此SELECT语句正在执行,但显然不能使用动态值。

作为一种解决方法,我想我可以将另一列ColD添加到Table1并从CSV文件中将LookupCode存储在其中,然后运行单独的查询以根据ColD的值更新每行ColC的值与SELECT子句一起使用;但我不希望表1中的ColD,而是希望直接填写ColC。

1 个答案:

答案 0 :(得分:0)

我发现为什么我试图使用的查询无效。它与CSV文件中的数据有关。第三个字段没有正确分隔(不确定原因),因此包含不可显示的字符,这些字符影响查询的SELECT子句中的比较。当我对CSV文件进行全局更新以消除此问题时,LOAD DATA查询按预期工作。

很抱歉给您带来不便。