2013-06-12 15 views
8

Full lỗi:Cảnh báo: tuyên bố không an toàn ghi vào nhật ký nhị phân sử dụng định dạng tuyên bố kể từ BINLOG_FORMAT = BÁO CÁO

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?

Trả lời

8

Không có cách nào để viết lại sql để không ném thông báo lỗi đó. Bất kỳ loại thứ tự nào cũng sẽ ném thông điệp đó vì người nô lệ có thể có những hàng khác nhau rồi là chủ nhân. mixed sẽ giải quyết nó, vì nó sẽ chỉ chuyển sang bản sao dựa trên row khi tuyên bố không an toàn để sao chép với statement.

+0

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