Sie können PREPARE
nicht verwenden um LOAD DATA INFILE
auszuführen .
Die Liste der Anweisungen, die Sie mit PREPARE
ausführen können sind auf dieser Seite dokumentiert:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
unter der Unterüberschrift „Zulässige SQL-Syntax in vorbereiteten Anweisungen“. Beachten Sie, dass diese Liste in früheren Versionen von MySQL anders sein kann.
Weil Sie PREPARE
nicht verwenden können , können Sie die von Ihnen verwendete Methode nicht ausführen, indem Sie eine Variable festlegen und eine dynamische SQL-Anweisung erstellen.
Aber Sie können LOAD DATA INFILE
ausführen ohne PREPARE
zu verwenden . Sie müssen den Dateinamen mithilfe der Shell-Variablensubstitution in die Anweisung interpolieren und sie dann als direkte SQL-Anweisung ausführen.
Ihre update.sql-Datei könnte so aussehen:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Dann können Sie Ihre Shell-Variable in die Datei einsetzen und das Ergebnis folgendermaßen ausführen:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Eine andere einfachere Möglichkeit ist die Verwendung von mysqlimport
, außer dass der Name der Eingabedatei mit Ihrem Tabellennamen identisch sein muss. Sie können Ihre Eingabedatei entweder umbenennen, damit sie mit der Tabelle übereinstimmt, in die Sie laden möchten (die Sie tmp
nennen ), oder erstellen Sie einen symbolischen Link:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
Die Erweiterung „.list“ wird von mysqlimport ignoriert, sodass Sie eine beliebige Dateierweiterung verwenden können oder keine.