sql >> Databasteknik >  >> RDS >> Mysql

MySQL ladda data:Det här kommandot stöds inte i det förberedda satsprotokollet ännu

Du kan inte använda PREPARE för att köra LOAD DATA INFILE .

Listan över satser som du kan köra med PREPARE finns dokumenterade på denna sida:https:/ /dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html under underrubriken "SQL-syntax tillåten i förberedda uttalanden". Observera att den här listan kan vara annorlunda i tidigare versioner av MySQL.

Eftersom du inte kan använda PREPARE , du kan inte göra den metod du använder genom att ställa in en variabel och göra en dynamisk SQL-sats.

Men du kan köra LOAD DATA INFILE utan att använda PREPARE . Du måste interpolera filnamnet i satsen med hjälp av skalvariabelsubstitution och sedan köra den som en direkt SQL-sats.

Din update.sql-fil kan se ut så här:

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

Sedan kan du ersätta din skalvariabel i filen och köra resultatet på detta sätt:

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

Ett annat enklare sätt är att använda mysqlimport , förutom att detta kräver att indatafilnamnet är detsamma som ditt tabellnamn. Du kan antingen byta namn på din indatafil så att den matchar tabellen du vill ladda in i (som du kallar tmp ), eller skapa en symbolisk länk:

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

Tillägget ".list" ignoreras av mysqlimport, så du kan använda vilket filtillägg som helst, eller inget.



  1. En recension av de nya analytiska fönsterfunktionerna i MySQL 8.0

  2. vad är det rätta sättet att konvertera mellan mysql datetime och python tidsstämpel?

  3. SQL Group efter och min (MySQL)

  4. lagra nummer som varchar