Mysql
 sql >> Database >  >> RDS >> Mysql

Dati di caricamento MySQL:questo comando non è ancora supportato nel protocollo di istruzioni preparato

Non puoi usare PREPARE per eseguire LOAD DATA INFILE .

L'elenco delle istruzioni che puoi eseguire con PREPARE sono documentati in questa pagina:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html sotto il sottotitolo "Sintassi SQL consentita nelle istruzioni preparate". Nota che questo elenco potrebbe essere diverso nelle versioni precedenti di MySQL.

Perché non puoi usare PREPARE , non puoi eseguire il metodo che stai utilizzando impostando una variabile e creando un'istruzione SQL dinamica.

Ma puoi eseguire LOAD DATA INFILE senza usare PREPARE . Devi interpolare il nome del file nell'istruzione usando la sostituzione della variabile della shell e quindi eseguirlo come un'istruzione SQL diretta.

Il tuo file update.sql potrebbe assomigliare a questo:

LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

Quindi puoi sostituire la tua variabile shell nel file ed eseguire il risultato in questo modo:

sed s/%spacename%/$1/ update.sql | 
  mysql -h "localhost" -u "root" "-pmypassword" "mydb"

Un altro modo più semplice è utilizzare mysqlimport , tranne per il fatto che il nome del file di input sia lo stesso del nome della tabella. Puoi rinominare il tuo file di input in modo che corrisponda alla tabella in cui vuoi caricare (che chiami tmp ), oppure crea un collegamento simbolico:

ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list

L'estensione ".list" viene ignorata da mysqlimport, quindi puoi utilizzare qualsiasi estensione di file o nessuna.