Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Dados de carregamento do MySQL:Este comando ainda não é suportado no protocolo de instrução preparado


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.