sql >> Database >  >> RDS >> Mysql

Bulk insert van MySQL-gerelateerde tabellen van bash

In uw vraag komen verschillende tegenstrijdige eisen naar voren. Dit antwoord concentreert zich op het "keep lock"-aspect ervan.

Om een ​​tabelvergrendeling voor de hele operatie te behouden, moet u een enkele verbinding met de sql-server onderhouden. Een manier zou zijn om alles door te geven als een meerregelige invoer met meerdere opdrachten aan een enkele aanroep van de mysql-opdrachtregelclient. Eigenlijk als volgt:

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

Dat zou werken zolang je alle vereiste verklaringen kunt genereren zonder vragen te stellen aan de database (zoals maximale identifier) ​​terwijl de vergrendeling behouden blijft.

Om leesbewerkingen (zoals vragen om een ​​maximale waarde) en schrijfbewerkingen (zoals het laden van inhoud van sommige bestanden) te combineren, hebt u een bidirectionele communicatie met de server nodig. Dit bereiken via bash is erg lastig, dus ik zou het afraden. Zelfs als je geen vragen hoeft te stellen, is de unidirectionele verbinding die wordt geboden door een bash-pipe een bron van gevaar:als er iets misgaat aan de mysql-kant, merkt bash het niet en geeft het toch het volgende commando. U kunt uiteindelijk inconsistente gegevens vastleggen.

Om deze redenen zou ik liever een scripttaal voorstellen waarvoor mysql-bindingen beschikbaar zijn, zoals de Perl- of Pyhon-opties die u noemde. Het lezen van CVS-bestanden in die talen is eenvoudig, dus u kunt al het volgende in één script doen:

  1. tafels vergrendelen
  2. transactie starten
  3. lees invoer-csv-bestanden
  4. stel vragen zoals max id
  5. pas invoergegevens aan zodat deze overeenkomen met de tafelindeling
  6. gegevens in tabellen invoegen
  7. als er geen fouten zijn opgetreden, transactie uitvoeren



  1. Maak verbinding met Oracle-database in dotnet mvc-toepassing

  2. Hoe schema's gebruiken in Django?

  3. Inleiding tot PL/SQL VARRAY's in Oracle Database

  4. SQL-query's