Mysql
 sql >> Base de données >  >> RDS >> Mysql

Données de chargement MySQL :cette commande n'est pas encore prise en charge dans le protocole d'instruction préparé

Vous ne pouvez pas utiliser PREPARE pour exécuter LOAD DATA INFILE .

La liste des instructions que vous pouvez exécuter avec PREPARE sont documentés dans cette page :https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html sous le sous-titre "Syntaxe SQL autorisée dans les instructions préparées". Notez que cette liste peut être différente dans les versions antérieures de MySQL.

Parce que vous ne pouvez pas utiliser PREPARE , vous ne pouvez pas appliquer la méthode que vous utilisez en définissant une variable et en créant une instruction SQL dynamique.

Mais vous pouvez exécuter LOAD DATA INFILE sans utiliser PREPARE . Vous devez interpoler le nom du fichier dans l'instruction à l'aide de la substitution de variable shell, puis l'exécuter en tant qu'instruction SQL directe.

Votre fichier update.sql pourrait ressembler à ceci :

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

Ensuite, vous pouvez substituer votre variable shell dans le fichier et exécuter le résultat de cette façon :

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

Un autre moyen plus simple consiste à utiliser mysqlimport , sauf que cela nécessite que le nom du fichier d'entrée soit le même que le nom de votre table. Vous pouvez soit renommer votre fichier d'entrée pour qu'il corresponde à la table dans laquelle vous souhaitez charger (que vous appelez tmp ), ou bien créez un lien symbolique :

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

L'extension ".list" est ignorée par mysqlimport, vous pouvez donc utiliser n'importe quelle extension de fichier, ou aucune.