MySQL加载数据:在准备好的语句协议中不支持这个命令

我正在尝试编写一个MySQL脚本来将数据导入到我的Linux服务器的表中。 这里是名为update.sql的脚本:

 SET @query = CONCAT("LOAD DATA LOCAL INFILE '", @spaceName, "' INTO TABLE tmp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';"); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

而且,我写了一个名为main.shbash脚本:

 mysql -h "localhost" -u "root" "-pmypassword" "mydb" -e "set @spaceName=\"$1\";source update.sql;" 

然后我执行./main.sh France.listFrance.list是我试图导入到数据库中的数据文件。

但是我得到一个错误:

错误1295(HY000)在文件中的第2行:'update.sql':准备语句协议中不支持此命令

我发现这个问题:
MySQL – 使用可变path加载数据Infile

那么,这是否意味着没有办法将parameter passing给LOAD DATA查询?

您不能使用PREPARE来运行LOAD DATA INFILE

您可以使用PREPARE运行的语句列表记录在此页面中: https : //dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html在子标题“SQL语法允许在准备好的声明“。 注意这个列表可能在早期版本的MySQL中有所不同。

因为你不能使用PREPARE ,所以你不能通过设置一个变量和制作一个动态的SQL语句来完成你正在使用的方法。

但是你可以运行LOAD DATA INFILE而不使用PREPARE 。 您必须使用shell变量替换将文件名插入到语句中,然后将其作为直接的SQL语句运行。

您的update.sql文件可能如下所示:

 LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; 

然后你可以用你的shell变量替换成这个文件,然后运行结果:

 sed s/%spacename%/$1/ update.sql | mysql -h "localhost" -u "root" "-pmypassword" "mydb" 

另一个更简单的方法是使用mysqlimport ,除了这要求输入文件名与您的表名相同。 您可以重命名您的输入文件以匹配要载入的表格(您称之为tmp ),也可以创建一个符号链接:

 ln -s $1 /tmp/tmp.list mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list rm -f /tmp/tmp.list 

“.list”扩展名被mysqlimport忽略,所以你可以使用任何文件扩展名,或者没有。