Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Ladedaten:Dieser Befehl wird im Protokoll für vorbereitete Anweisungen noch nicht unterstützt

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.