Du kan inte använda PREPARE
för att köra LOAD DATA INFILE
.
Listan över satser som du kan köra med PREPARE
finns dokumenterade på denna sida:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
under underrubriken "SQL-syntax tillåten i förberedda uttalanden". Observera att den här listan kan vara annorlunda i tidigare versioner av MySQL.
Eftersom du inte kan använda PREPARE
, du kan inte göra den metod du använder genom att ställa in en variabel och göra en dynamisk SQL-sats.
Men du kan köra LOAD DATA INFILE
utan att använda PREPARE
. Du måste interpolera filnamnet i satsen med hjälp av skalvariabelsubstitution och sedan köra den som en direkt SQL-sats.
Din update.sql-fil kan se ut så här:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Sedan kan du ersätta din skalvariabel i filen och köra resultatet på detta sätt:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Ett annat enklare sätt är att använda mysqlimport
, förutom att detta kräver att indatafilnamnet är detsamma som ditt tabellnamn. Du kan antingen byta namn på din indatafil så att den matchar tabellen du vill ladda in i (som du kallar tmp
), eller skapa en symbolisk länk:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
Tillägget ".list" ignoreras av mysqlimport, så du kan använda vilket filtillägg som helst, eller inget.