Du kan ikke bruge PREPARE
for at køre LOAD DATA INFILE
.
Listen over udsagn, som du kan køre med PREPARE
er dokumenteret på denne side:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
under underoverskriften "SQL-syntaks tilladt i udarbejdede erklæringer". Bemærk, at denne liste kan være anderledes i tidligere versioner af MySQL.
Fordi du ikke kan bruge PREPARE
, kan du ikke udføre den metode, du bruger, ved at indstille en variabel og lave en dynamisk SQL-sætning.
Men du kan køre LOAD DATA INFILE
uden at bruge PREPARE
. Du skal interpolere filnavnet i sætningen ved hjælp af shell-variabelsubstitution og derefter køre den som en direkte SQL-sætning.
Din update.sql-fil kan se sådan ud:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Derefter kan du erstatte din shell-variabel i filen og køre resultatet på denne måde:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
En anden enklere måde er at bruge mysqlimport
, bortset fra at dette kræver, at inputfilnavnet er det samme som dit tabelnavn. Du kan enten omdøbe din inputfil, så den matcher den tabel, du vil indlæse i (som du kalder tmp
), eller også oprette et symbolsk link:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
".list"-udvidelsen ignoreres af mysqlimport, så du kan bruge enhver filtypenavn eller ingen.