Ve vaší otázce jsou uvedeny různé protichůdné požadavky. Tato odpověď se soustředí na její aspekt „zamknout“.
Chcete-li zachovat zámek tabulky pro celou operaci, budete muset udržovat jediné připojení k serveru SQL. Jedním ze způsobů by bylo předat vše jako víceřádkový vícepříkazový vstup do jediného vyvolání klienta příkazového řádku mysql. V podstatě takto:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
To by fungovalo, pokud můžete generovat všechny požadované příkazy bez kladení otázek z databáze (jako maximální identifikátor), zatímco je zámek zachován.
Abyste mohli kombinovat operace čtení (např. dotaz na maximální hodnotu) a operace zápisu (např. načítání obsahu některých souborů), budete potřebovat obousměrnou komunikaci se serverem. Dosažení tohoto pomocí bash je velmi složité, takže bych to nedoporučoval. I když nemusíte klást otázky, jednosměrné připojení poskytované bash pipe je zdrojem nebezpečí:Pokud se na straně mysql něco pokazí, bash si toho nevšimne a stejně vydá další příkaz. Mohli byste skončit odevzdáním nekonzistentních dat.
Z těchto důvodů bych raději navrhl nějaký skriptovací jazyk, pro který jsou k dispozici vazby mysql, jako jsou možnosti Perl nebo Pyhon, které jste zmínil. Čtení souborů CVS v těchto jazycích je snadné, takže můžete provádět všechny následující činnosti v jediném skriptu:
- uzamknout stoly
- zahájit transakci
- číst vstupní soubory csv
- pokládejte otázky jako max. id
- upravte vstupní data tak, aby odpovídala rozložení tabulky
- vkládání dat do tabulek
- pokud nedošlo k žádným chybám, potvrďte transakci