2016-01-21 62 views
0

我想读取一个csv文件并将行插入到表中。当我分配值时,我可以插入它们而没有任何问题。但是当我尝试使用@user变量时,同样的sql停止工作。mysql infile无法访问子查询中的@user变量

所有帮助表示赞赏。

这工作:

LOAD DATA INFILE 'tmp/test.csv' 

INTO TABLE T1 

FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(@var1) 
set create_timestamp = now(), 
col1 = (select max(id) from T2 where 
col2 = 1234); 

这不起作用:

LOAD DATA INFILE 'tmp/test.csv' 

INTO TABLE T1 

FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(@var1) 
set create_timestamp = now(), 
col1 = (select max(id) from T2 where 
col2 = @var1); 
+1

“不起作用”是什么意思? –

+0

问题发生在子查询中,在这里它无法访问用户变量@ var1。 子查询的作品,当我给它一个恒定的值,如1234. – Aniks

+1

@Anika。 。 。它正在产生一个错误。如果是这样?它是否产生了不良结果。如果是这样? –

回答

0

我怀疑是子查询(select max(id) from正在执行前值分配给@var1

我真的很惊讶,第一个例子可以工作;我从来没有尝试在LOAD DATA中运行子查询。

当你说“这不起作用”,你的意思是LOAD DATA引发错误?或者你的意思是LOAD DATA成功完成,但意想不到的结果?

在后一种情况下,我推荐一个简单的测试,在LOAD DATA之前单独做一个SET @var1 = 1234;声明,看看第一行会发生什么。

如果发生错误,可能是该子查询在该上下文中不受支持。 (我们需要查阅MySQL参考手册,看看是否支持。)

这就是我的猜测。 1)意外的操作顺序(@var1正在评估之前该行的值被分配给@var1),或者2)子查询在该上下文中无效。


编辑

根据MySQL参考手册5.7

http://dev.mysql.com/doc/refman/5.7/en/load-data.html

它看起来像一个子查询的LOAD DATA语句的上下文支持。

+0

是的手册显示您可以访问用户变量。将@ var1结果用于分配给col1的空值,因此失败。我需要设置从csv文件读取的值。 – Aniks

+0

是的,我知道你可以给一个用户变量'@ var1'分配一个字段,并在'SET'的右边的表达式中引用用户变量。我询问的是当*子查询得到评估时。我怀疑这个子查询是否被评估过一次,*在外部LOAD DATA开始处理行之前*。我在回答中建议的测试旨在检查该问题。在LOAD DATA语句之前,将该变量设置为您希望工作的值,该值会导致子查询'(select max(id)...'返回与第一行中的字段值不同的结果。 – spencer7593

0

我遇到同样的问题。我的问题的一部分是,以你的表定义为例,T1.col1被设置为NOT NULL,但表达式“select max(id)from T2 where col2 = @ var1”导致没有返回值,所以MySQL试图为col1分配一个空值。这并没有解决所有问题,但这是一个开始。

这里就是我的工作:

LOAD DATA LOCAL INFILE 'streets.csv' 
INTO TABLE streets 
CHARACTER SET latin1 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(pre_dir, name, suffix, post_dir, @community, @state) 
SET community_id  = (SELECT community_id FROM communities_v WHERE community_name = @community AND state_abbr = @state); 

编辑:我原本放了一堆其他的东西在这里,我想到的是相关的问题,但事实证明,没有。这确实是一个数据问题。我使用的子查询有@community和@state的某些组合,它们对community_id没有任何价值,所以我会仔细检查你自己的子查询,看它是否在所有情况下都返回一个值。