我正在尝试编写一个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.sh
的bash脚本:
mysql -h "localhost" -u "root" "-pmypassword" "mydb" -e "set @spaceName=\"$1\";source update.sql;"
然后我执行./main.sh France.list
。 France.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忽略,所以你可以使用任何文件扩展名,或者没有。