Chad Birch có một ý tưởng hay với việc sử dụng Trình kích hoạt MySQL và một hàm do người dùng xác định . Bạn có thể tìm hiểu thêm trong Cú pháp TẠO TRIGGER của MySQL tham khảo.
Nhưng bạn có chắc chắn rằng bạn cần gọi một tệp thực thi ngay lập tức khi hàng được chèn vào không? Có vẻ như phương pháp đó sẽ dễ bị thất bại, vì MySQL có thể tạo ra nhiều trường hợp thực thi cùng một lúc. Nếu tệp thực thi của bạn không thành công, thì sẽ không có bản ghi nào về hàng nào đã được xử lý và hàng nào chưa được xử lý. Nếu MySQL đang đợi tệp thực thi của bạn kết thúc, thì việc chèn các hàng có thể rất chậm. Ngoài ra, nếu Chad Birch đúng, thì sẽ phải biên dịch lại MySQL, vì vậy nghe có vẻ khó khăn.
Thay vì gọi tệp thực thi trực tiếp từ MySQL, tôi sẽ sử dụng trình kích hoạt để đơn giản ghi lại thực tế là một hàng đã được CHÈN hoặc CẬP NHẬT:ghi lại thông tin đó trong cơ sở dữ liệu, với các cột mới trong bảng hiện có của bạn hoặc với một bảng hoàn toàn mới được gọi là say database_changes
. Sau đó, tạo một chương trình bên ngoài thường xuyên đọc thông tin từ cơ sở dữ liệu, xử lý và đánh dấu thông tin đó là xong.
Giải pháp cụ thể của bạn sẽ phụ thuộc vào những thông số mà chương trình bên ngoài thực sự cần.
Nếu chương trình bên ngoài của bạn cần biết hàng nào đã được chèn, thì giải pháp của bạn có thể như sau:Tạo một bảng mới có tên database_changes
với các trường date
, table_name
và row_id
và đối với tất cả các bảng khác, hãy tạo một trình kích hoạt như sau:
CREATE TRIGGER `my_trigger`
AFTER INSERT ON `table_name`
FOR EACH ROW BEGIN
INSERT INTO `database_changes` (`date`, `table_name`, `row_id`)
VALUES (NOW(), "table_name", NEW.id)
END;
Sau đó, tập lệnh hàng loạt của bạn có thể làm điều gì đó như sau:
- Chọn hàng đầu tiên trong bảng database_changes.
- Xử lý nó.
- Xóa nó.
- Lặp lại 1-3 cho đến khi
database_changes
trống.
Với cách tiếp cận này, bạn có thể kiểm soát nhiều hơn thời gian và cách thức dữ liệu được xử lý và bạn có thể dễ dàng kiểm tra xem dữ liệu có thực sự được xử lý hay không (chỉ cần kiểm tra xem database_changes
bảng trống).