Mysql
 sql >> база данни >  >> RDS >> Mysql

Групово вмъкване на свързани с MySQL таблици от bash

Има различни противоречиви изисквания, изразени във вашия въпрос. Този отговор се концентрира върху аспекта „запазване на заключването“.

За да поддържате заключване на таблица за цялата операция, ще трябва да поддържате една връзка към sql сървъра. Един от начините би бил предаването на всичко като многоредов вход с множество команди към еднократно извикване на клиента на командния ред mysql. По принцип така:

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

Това ще работи, стига да можете да генерирате всички необходими изрази, без да задавате въпроси от базата данни (като максимален идентификатор), докато ключалката е запазена.

За да смесите операции за четене (като искане за максимална стойност) и операции за запис (като зареждане на съдържание на някои файлове), ще ви е необходима двупосочна комуникация със сървъра. Постигането на това чрез bash е много трудно, така че бих ви посъветвал да не го правите. Дори и да не е необходимо да задавате въпроси, еднопосочната връзка, осигурена от bash тръба, е източник на опасност:ако нещо се обърка от страна на mysql, bash няма да забележи и така или иначе ще издаде следващата команда. Може да се окаже, че предавате непоследователни данни.

Поради тези причини бих предпочел да предложа някакъв скриптов език, за който са налични обвързвания на mysql, като опциите Perl или Pyhon, които споменахте. Четенето на CVS файлове на тези езици е лесно, така че можете да направите всичко от следното в един скрипт:

  1. заключване на маси
  2. започнете транзакция
  3. чете входни csv файлове
  4. задавайте въпроси като max id
  5. коригирайте входните данни, за да съответстват на оформлението на таблицата
  6. вмъкнете данни в таблици
  7. ако не са възникнали грешки, изпълнете транзакцията



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как получаването на последното вмъкване на mysql ID работи с транзакциите? + въпроси за транзакциите

  2. Таблица за изтриване на Android SQLite всъщност не изтрива редовете

  3. Получаване на грешка при свързване ECONNREFUSED 127.0.0.1:3306 при свързване към mysql

  4. CodeIgniter конфигурира различни IP за ЧЕТЕНЕ и ПИСАНЕ на MySQL данни

  5. Съществуват проблеми с добавянето на нов идентификатор (автоматично увеличение) след таблицата