あなたの質問には、相反するさまざまな要件があります。この答えは、その「ロックを維持する」側面に焦点を当てています。
操作全体でテーブルロックを維持するには、SQLサーバーへの単一の接続を維持する必要があります。 1つの方法は、すべてを複数行の複数コマンド入力としてmysqlコマンドラインクライアントの1回の呼び出しに渡すことです。基本的にこのように:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
これは、ロックが維持されている間、データベースから(最大識別子などの)質問をせずに必要なすべてのステートメントを生成できる限り機能します。
読み取り操作(最大値の要求など)と書き込み操作(一部のファイルのコンテンツのロードなど)を組み合わせるには、サーバーとの双方向通信が必要になります。 bashでこれを達成するのは非常に難しいので、反対することをお勧めします。質問する必要がない場合でも、bashパイプによって提供される単方向接続は危険の原因です。mysql側で問題が発生した場合、bashは気付かず、とにかく次のコマンドを発行します。一貫性のないデータをコミットしてしまう可能性があります。
これらの理由から、あなたが言及したPerlまたはPyhonオプションのように、mysqlバインディングが利用可能なスクリプト言語をお勧めします。これらの言語でCVSファイルを読み取るのは簡単なので、1つのスクリプトで次のすべてを実行できます。
- テーブルをロックする
- トランザクションを開始
- 入力csvファイルを読み取る
- 最大IDなどの質問をする
- テーブルのレイアウトに一致するように入力データを調整します
- テーブルにデータを挿入
- エラーが発生しなかった場合は、トランザクションをコミットします