I'm trying to write a MySQL script to import data into a table for my Linux server. Here is the script named 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;
And also, I write a bash script named main.sh:
mysql -h "localhost" -u "root" "-pmypassword" "mydb" -e "set @spaceName=\"$1\";source update.sql;"
Then I execute ./main.sh France.list. The France.list is the data file that I'm trying to import into my database.
However I get an error:
ERROR 1295 (HY000) at line 2 in file: 'update.sql': This command is not supported in the prepared statement protocol yet
I've found this question:
MySQL - Load Data Infile with variable path
So, does it mean that there is no way to pass arguments to LOAD DATA query?
You can't use PREPARE to run LOAD DATA INFILE.
The list of statements that you can run with PREPARE are documented in this page: https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html under the subheading "SQL Syntax Allowed in Prepared Statements". Note this list may be different in earlier versions of MySQL.
Because you can't use PREPARE, you can't do the method you're using by setting a variable and making a dynamic SQL statement.
But you can run LOAD DATA INFILE without using PREPARE. You have to interpolate the filename into the statement using shell variable substitution and then run it as a direct SQL statement.
Your update.sql file might look like this:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Then you can substitute your shell variable into the file and run the result this way:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Another simpler way is to use mysqlimport, except this requires that the input filename be the same as your table name. You can either rename your input file to match the table you want to load into (which you call tmp), or else create a symbolic link:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
The ".list" extension is ignored by mysqlimport, so you can use any file extension, or none.
来源:https://stackoverflow.com/questions/44360756/mysql-load-data-this-command-is-not-supported-in-the-prepared-statement-protoco