您的问题中表达了各种相互矛盾的要求。这个答案集中在它的“保持锁定”方面。
为了维护整个操作的表锁,您必须维护到 sql server 的单个连接。一种方法是将所有内容作为多行多命令输入传递给 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 文件
- 问最大ID之类的问题
- 调整输入数据以匹配表格布局
- 向表中插入数据
- 如果没有发生错误,则提交事务