Не можете да използвате 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
. Трябва да интерполирате името на файла в израза, като използвате заместване на променлива на обвивката и след това да го изпълните като директен SQL израз.
Вашият файл update.sql може да изглежда така:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
След това можете да замените вашата шел променлива във файла и да стартирате резултата по следния начин:
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, така че можете да използвате всяко файлово разширение или никакво.