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.