Có nhiều yêu cầu mâu thuẫn khác nhau được thể hiện trong câu hỏi của bạn. Câu trả lời này tập trung vào khía cạnh "giữ khóa" của nó.
Để duy trì khóa bảng cho toàn bộ hoạt động, bạn sẽ phải duy trì một kết nối duy nhất đến máy chủ sql. Một cách sẽ là chuyển mọi thứ dưới dạng đầu vào đa lệnh nhiều dòng cho một lệnh gọi duy nhất của máy khách dòng lệnh mysql. Về cơ bản như thế này:
{ echo "LOCK TABLES Table1 WRITE"
for i in "${infiles[@]}"; do
echo "LOAD DATA LOCAL INFILE '${i}'"
done
} | mysql
Điều đó sẽ hoạt động miễn là bạn có thể tạo tất cả các câu lệnh được yêu cầu mà không cần đặt câu hỏi từ cơ sở dữ liệu (như số nhận dạng tối đa) trong khi khóa được giữ.
Để kết hợp các thao tác đọc (như yêu cầu giá trị lớn nhất) và thao tác ghi (như tải nội dung của một số tệp), bạn sẽ cần giao tiếp hai chiều với máy chủ. Để đạt được điều này thông qua bash là rất khó, vì vậy tôi khuyên bạn không nên làm điều đó. Ngay cả khi bạn không cần đặt câu hỏi, kết nối một chiều được cung cấp bởi một đường ống bash là một nguồn nguy hiểm:Nếu có gì sai ở phía mysql, bash sẽ không nhận thấy và sẽ đưa ra lệnh tiếp theo. Cuối cùng, bạn có thể phạm phải dữ liệu không nhất quán.
Vì những lý do này, tôi muốn đề xuất một số ngôn ngữ kịch bản có sẵn các ràng buộc mysql, như các tùy chọn Perl hoặc Pyhon mà bạn đã đề cập. Đọc các tệp CVS bằng những ngôn ngữ đó rất dễ dàng, vì vậy bạn có thể thực hiện tất cả những việc sau trong một tập lệnh duy nhất:
- khóa bảng
- bắt đầu giao dịch
- đọc các tệp csv đầu vào
- đặt các câu hỏi như id tối đa
- điều chỉnh dữ liệu đầu vào để phù hợp với bố cục bảng
- chèn dữ liệu vào bảng
- nếu không có lỗi xảy ra, hãy thực hiện giao dịch