Има различни противоречиви изисквания, изразени във вашия въпрос. Този отговор се концентрира върху аспекта „запазване на заключването“.
За да поддържате заключване на таблица за цялата операция, ще трябва да поддържате една връзка към 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 файлове на тези езици е лесно, така че можете да направите всичко от следното в един скрипт:
- заключване на маси
- започнете транзакция
- чете входни csv файлове
- задавайте въпроси като max id
- коригирайте входните данни, за да съответстват на оформлението на таблицата
- вмъкнете данни в таблици
- ако не са възникнали грешки, изпълнете транзакцията