Nie możesz użyć PREPARE
aby uruchomić LOAD DATA INFILE
.
Lista instrukcji, które możesz uruchomić za pomocą PREPARE
są udokumentowane na tej stronie:https:// /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
pod nagłówkiem „Składnia SQL dozwolona w przygotowanych wyciągach”. Pamiętaj, że ta lista może być inna we wcześniejszych wersjach MySQL.
Ponieważ nie możesz użyć PREPARE
, nie możesz zastosować metody, której używasz, ustawiając zmienną i wykonując dynamiczną instrukcję SQL.
Ale możesz uruchomić LOAD DATA INFILE
bez użycia PREPARE
. Musisz interpolować nazwę pliku do instrukcji za pomocą podstawiania zmiennej powłoki, a następnie uruchomić ją jako bezpośrednią instrukcję SQL.
Twój plik update.sql może wyglądać tak:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Następnie możesz podstawić zmienną powłoki do pliku i uruchomić wynik w ten sposób:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Innym prostszym sposobem jest użycie mysqlimport
, ale wymaga to, aby nazwa pliku wejściowego była taka sama jak nazwa tabeli. Możesz zmienić nazwę pliku wejściowego, aby pasowała do tabeli, do której chcesz załadować (którą nazywasz tmp
) lub utwórz dowiązanie symboliczne:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
Rozszerzenie ".list" jest ignorowane przez mysqlimport, więc możesz użyć dowolnego rozszerzenia pliku lub żadnego.