mysql infile无法在子查询中访问@user变量

时间:2016-01-21 23:44:24

标签: mysql sql

我正在尝试读取csv文件并将行插入表中。我在分配值时能够毫无问题地插入它们。但是当我尝试使用@user变量时,相同的sql停止工作。

感谢所有帮助。

这有效:

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 );

2 个答案:

答案 0 :(得分:0)

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

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

当你说"这不起作用"你的意思是LOAD DATA会抛出错误吗?或者您的意思是LOAD DATA成功完成,但意外结果?

在后一种情况下,我建议进行简单测试,在SET @var1 = 1234;之前单独执行LOAD DATA语句,并查看第一行会发生什么。

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

我的猜测。 1)意外的操作顺序({<1}}正在评估 之前将行的值分配给@var1),或2)子查询无效那个背景。

修改

根据MySQL参考手册5.7

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

看起来在LOAD DATA语句的上下文中支持子查询。

答案 1 :(得分:0)

我遇到了同样的问题。我的一部分问题是,使用您的表定义作为示例,T1.col1设置为NOT NULL,但表达式&#34;从T2选择max(id),其中col2 = @ var1&#34;导致没有返回任何内容,因此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没有任何价值,所以我会仔细检查你自己的子查询,看它是否在所有情况下都返回一个值。