Você não pode usar
PREPARE
para executar LOAD DATA INFILE
. A lista de instruções que você pode executar com
PREPARE
estão documentados nesta página:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
sob o subtítulo "Sintaxe SQL permitida em instruções preparadas". Observe que esta lista pode ser diferente em versões anteriores do MySQL. Porque você não pode usar
PREPARE
, você não pode fazer o método que está usando definindo uma variável e fazendo uma instrução SQL dinâmica. Mas você pode executar
LOAD DATA INFILE
sem usar PREPARE
. Você precisa interpolar o nome do arquivo na instrução usando a substituição de variável do shell e, em seguida, executá-lo como uma instrução SQL direta. Seu arquivo update.sql pode ter esta aparência:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Então você pode substituir sua variável shell no arquivo e executar o resultado desta maneira:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Outra maneira mais simples é usar mysqlimport , exceto que isso requer que o nome do arquivo de entrada seja o mesmo que o nome da sua tabela. Você pode renomear seu arquivo de entrada para corresponder à tabela que deseja carregar (que você chama de
tmp
), ou então crie um link simbólico:ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
A extensão ".list" é ignorada pelo mysqlimport, então você pode usar qualquer extensão de arquivo ou nenhuma.