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

MySQL indlæs data:Denne kommando er ikke understøttet i den forberedte sætningsprotokol endnu

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.



  1. Databasedesign:Sammensat nøgle vs primærnøgle i én kolonne

  2. PHP:hvorfor kan jeg ikke sløjfe to gange på mysqli_fetch_array() resultater?

  3. SQL-database med variabelt antal kolonner

  4. Udførelse af rekursive lagrede procedurer i MYSQL for at få hierarkiske data