sql >> Databasteknik >  >> RDS >> Mysql

Massinlägg av MySQL-relaterade tabeller från bash

Det finns olika motstridiga krav som uttrycks i din fråga. Detta svar koncentrerar sig på "håll lås"-aspekten av det.

För att upprätthålla ett tabelllås för hela operationen måste du upprätthålla en enda anslutning till sql-servern. Ett sätt skulle vara att skicka allt som en multi-line multi-command input till en enda anrop av mysql kommandoradsklient. I princip så här:

{ echo "LOCK TABLES Table1 WRITE"
  for i in "${infiles[@]}"; do
    echo "LOAD DATA LOCAL INFILE '${i}'"
  done
} | mysql

Det skulle fungera så länge du kan generera alla nödvändiga uttalanden utan att ställa frågor från databasen (som maximal identifierare) medan låset hålls.

För att blanda läsoperationer (som att be om ett maximalt värde) och skrivoperationer (som att ladda innehållet i vissa filer), behöver du en dubbelriktad kommunikation med servern. Att uppnå detta genom bash är väldigt knepigt, så jag avråder från det. Även om du inte behöver ställa frågor, är den enkelriktade anslutningen som tillhandahålls av ett bashpipa en källa till fara:Om något går fel på mysql-sidan kommer bash inte att märka det och kommer att utfärda nästa kommando ändå. Det kan sluta med att du begår inkonsekventa data.

Av dessa skäl skulle jag hellre föreslå något skriptspråk för vilket mysql-bindningar är tillgängliga, som Perl- eller Pyhon-alternativen du nämnde. Att läsa CVS-filer på dessa språk är lätt, så du kan göra allt av följande i ett enda skript:

  1. lås tabeller
  2. starta transaktionen
  3. läs indata-csv-filer
  4. ställ frågor som max id
  5. justera indata för att matcha tabelllayout
  6. infoga data i tabeller
  7. om inga fel inträffade, genomför transaktionen



  1. Var kan man använda mysql_real_escape_string för att förhindra SQL-injektion?

  2. MySQL Row-nivålås

  3. Svårt att bestämma sig för identifierande eller icke-identifierande relation

  4. Behöver MySQL INSERT - SELECT-fråga för tabeller med miljontals poster