Warning: Unsafe statement written to the binary log using statement format
since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an
auto-increment column after selecting from another table are unsafe because
the order in which rows are retrieved determines what (if any) rows will be
written. This order cannot be predicted and may differ on master and the
slave.
tôi chỉ dường như nhận được lỗi này khi cố gắng chạy SQL liệu từ Django. Nếu tôi chạy SQL từ máy khách MySQL CLI, tôi không gặp lỗi tương tự. Dưới đây là SQL:
UPDATE picture p
JOIN (
SELECT @inc := @inc + 1 AS new_weight, id
FROM (SELECT @inc := 0) temp, (
SELECT id FROM picture
WHERE album_id = 5
ORDER BY taken_date ASC
) AS pw
) AS pw
ON p.id = pw.id
SET p.weight = pw.new_weight;
Mục đích của việc này là đặt hàng các bản ghi và áp dụng số thứ tự liên tiếp để giữ nguyên thứ tự này trong cơ sở dữ liệu.
Tôi đã thử chạy lệnh này trong thời hạn cho khách hàng để xem nếu tôi có thể tái tạo vấn đề này tuy nhiên nó vẫn chạy thành công:
mysql> SET GLOBAL binlog_format = 'STATEMENT';
Ngoài ra, điều quan trọng là tôi hoặc là giải quyết hoặc viết lại SQL để làm việc với ràng buộc này là ứng dụng cuối cùng gần như chắc chắn sẽ chạy trên một thiết lập cơ sở dữ liệu master-slave.
* CHỈNH SỬA: Sau khi đọc thêm một chút binlog_format
, có vẻ như ROW hoặc MIXED hoàn toàn có thể chấp nhận được, tuy nhiên mối quan tâm chính của tôi không thể sao chép vấn đề này trong CLI của MySQL để kiểm tra xem MIXED/ROW có thể giải quyết vấn đề này?
Có, tôi chỉ đơn giản là chuyển sang 'trộn' là câu trả lời, và nó giải quyết được vấn đề tốt cho tôi. Chúc tôi có thể nhân rộng trên CLI nhưng nó hoạt động ngay bây giờ :) – DanH