Twoje pytanie zawiera różne sprzeczne wymagania. Ta odpowiedź koncentruje się na aspekcie „utrzymania blokady”.
Aby utrzymać blokadę tabeli dla całej operacji, będziesz musiał utrzymywać jedno połączenie z serwerem sql. Jednym ze sposobów byłoby przekazanie wszystkiego jako wielowierszowych danych wejściowych z wieloma poleceniami do pojedynczego wywołania klienta wiersza poleceń mysql. W zasadzie tak:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
To zadziała tak długo, jak długo będziesz mógł wygenerować wszystkie wymagane instrukcje bez zadawania pytań z bazy danych (takich jak maksymalny identyfikator), gdy blokada jest utrzymywana.
W celu połączenia operacji odczytu (takich jak pytanie o maksymalną wartość) i operacji zapisu (takich jak ładowanie zawartości niektórych plików), będziesz potrzebować dwukierunkowej komunikacji z serwerem. Osiągnięcie tego przez bash jest bardzo trudne, więc odradzałbym to. Nawet jeśli nie musisz zadawać pytań, jednokierunkowe połączenie zapewniane przez potok bash jest źródłem niebezpieczeństwa:jeśli coś pójdzie nie tak po stronie mysql, bash nie zauważy i i tak wyda następne polecenie. Możesz popełnić niespójne dane.
Z tych powodów wolę sugerować jakiś język skryptowy, dla którego dostępne są powiązania mysql, takie jak opcje Perla lub Pyhon, o których wspomniałeś. Odczytywanie plików CVS w tych językach jest łatwe, więc możesz wykonać wszystkie poniższe czynności w jednym skrypcie:
- zablokuj tabele
- rozpocznij transakcję
- odczytaj wejściowe pliki csv
- zadawaj pytania, takie jak maksymalny identyfikator
- dostosuj dane wejściowe, aby pasowały do układu tabeli
- wstaw dane do tabel
- jeśli nie wystąpiły żadne błędy, zatwierdź transakcję