sql >> Base de Datos >  >> RDS >> Mysql

Datos de carga de MySQL:este comando aún no es compatible con el protocolo de declaraciones preparadas

No puedes usar PREPARE para ejecutar LOAD DATA INFILE .

La lista de instrucciones que puede ejecutar con PREPARE están documentados en esta página:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html bajo el subtítulo "Sintaxis SQL permitida en declaraciones preparadas". Tenga en cuenta que esta lista puede ser diferente en versiones anteriores de MySQL.

Porque no puedes usar PREPARE , no puede hacer el método que está usando configurando una variable y haciendo una instrucción SQL dinámica.

Pero puede ejecutar LOAD DATA INFILE sin usar PREPARE . Tiene que interpolar el nombre del archivo en la declaración utilizando la sustitución de variable de shell y luego ejecutarlo como una declaración SQL directa.

Su archivo update.sql podría verse así:

LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

Luego puede sustituir su variable de shell en el archivo y ejecutar el resultado de esta manera:

sed s/%spacename%/$1/ update.sql | 
  mysql -h "localhost" -u "root" "-pmypassword" "mydb"

Otra forma más sencilla es usar mysqlimport , excepto que esto requiere que el nombre del archivo de entrada sea el mismo que el nombre de la tabla. Puede cambiar el nombre de su archivo de entrada para que coincida con la tabla en la que desea cargar (a la que llama tmp ), o bien crea un enlace simbólico:

ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list

mysqlimport ignora la extensión ".list", por lo que puede usar cualquier extensión de archivo o ninguna.