Điều đầu tiên, khóa chính nhiều cột đó có lẽ là một ý tưởng tồi; như bạn đã phát hiện ra, rất khó để thao tác các trường riêng lẻ. Những gì bạn phải làm là thêm một cột bigint tự động gia tăng vào bảng đó, cột này sẽ trở thành khóa chính mới của bạn và thay vào đó, ràng buộc về tính duy nhất ba cột của bạn có thể là một chỉ mục duy nhất. Nó sẽ hoạt động tốt hơn ... nhưng nó cũng sẽ cho phép bạn thực hiện loại thao tác bạn cần. Nó sẽ cho phép bạn thực hiện các sửa đổi nhưng vẫn cho phép bạn xác định các hàng ban đầu bằng chỉ mục số nguyên của chúng.
Nếu bạn làm điều đó, "cập nhật một lần" của bạn hiện có thể được thực hiện một cách an toàn, miễn là bạn không ngại tạo một số bảng tạm thời để làm việc. Một cái gì đó như thế này:
Tạo một vài bảng tạm thời với cùng một giản đồ, nhưng không có duy nhất chỉ mục ba cột - bạn có thể có một chỉ mục không phải là duy nhất, vì nó sẽ giúp ích cho các truy vấn bạn sắp thực hiện;
Sao chép các bản ghi bạn cần xử lý vào bảng đầu tiên (bao gồm khóa chính số nguyên duy nhất);
Cập nhật tất cả detail
các cột bạn cần cập nhật trong bảng tạm thời;
Sử dụng INSERT ... SELECT
với SUM
và GROUP BY
để hợp nhất các bản ghi đó vào bảng thứ hai;
INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...
Cuối cùng, xóa tất cả các bản ghi trong bảng temp1 khỏi bảng gốc (sử dụng khóa chính số nguyên) và chèn các bản ghi trong bảng temp2 vào bảng gốc.