U kunt PREPARE
niet gebruiken om LOAD DATA INFILE
. uit te voeren .
De lijst met instructies die u kunt uitvoeren met PREPARE
zijn gedocumenteerd op deze pagina:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
onder de subkop "SQL-syntaxis toegestaan in voorbereide verklaringen". Merk op dat deze lijst in eerdere versies van MySQL anders kan zijn.
Omdat je PREPARE
niet kunt gebruiken , kunt u de methode die u gebruikt niet uitvoeren door een variabele in te stellen en een dynamisch SQL-statement te maken.
Maar u kunt LOAD DATA INFILE
. uitvoeren zonder PREPARE
. te gebruiken . U moet de bestandsnaam in de instructie interpoleren met behulp van shell-variabelevervanging en deze vervolgens uitvoeren als een directe SQL-instructie.
Uw update.sql-bestand kan er als volgt uitzien:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Vervolgens kunt u uw shell-variabele in het bestand vervangen en het resultaat op deze manier uitvoeren:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Een andere, eenvoudigere manier is om mysqlimport
te gebruiken. , behalve dat dit vereist dat de invoerbestandsnaam hetzelfde is als uw tabelnaam. U kunt uw invoerbestand hernoemen zodat het overeenkomt met de tabel waarin u wilt laden (die u tmp
noemt ), of maak anders een symbolische link:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
De extensie ".list" wordt genegeerd door mysqlimport, dus u kunt elke bestandsextensie gebruiken, of geen.