Nemůžete použít PREPARE
pro spuštění LOAD DATA INFILE
.
Seznam příkazů, které můžete spustit pomocí PREPARE
jsou zdokumentovány na této stránce:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
pod podnadpisem "Syntaxe SQL povolena v připravených příkazech". Tento seznam se může v dřívějších verzích MySQL lišit.
Protože nemůžete použít PREPARE
, nemůžete použít metodu, kterou používáte, nastavením proměnné a vytvořením dynamického příkazu SQL.
Můžete ale spustit LOAD DATA INFILE
bez použití PREPARE
. Musíte interpolovat název souboru do příkazu pomocí substituce proměnné shellu a poté jej spustit jako přímý příkaz SQL.
Váš soubor update.sql může vypadat takto:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Pak můžete do souboru nahradit proměnnou shellu a výsledek spustit takto:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Dalším jednodušším způsobem je použít mysqlimport
, ale to vyžaduje, aby vstupní název souboru byl stejný jako název vaší tabulky. Vstupní soubor můžete buď přejmenovat, aby odpovídal tabulce, do které chcete načíst (což nazýváte tmp
), nebo vytvořte symbolický odkaz:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
Příponu „.list“ mysqlimport ignoruje, takže můžete použít jakoukoli příponu souboru, nebo žádnou.