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.
Wydaje mi się tylko, aby uzyskać ten błąd podczas próby uruchomienia surowego SQL z Django. Jeśli uruchomię SQL z klienta MySQL CLI, nie otrzymam tego samego błędu. Oto 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;
Celem jest to, aby zamówić dokumentację i zastosować kolejny numer do masy, aby utrzymywać tę kolejność w bazie danych.
Próbowałem uruchamiania tej komendy wewnątrz klienta, aby zobaczyć, czy mogę powtórzyć problem jednak nadal działa skutecznie:
mysql> SET GLOBAL binlog_format = 'STATEMENT';
Ponadto, ważne jest, że albo rozwiązać lub przepisać SQL do pracy z to ograniczenie, ponieważ ostateczna aplikacja prawie na pewno będzie działała w konfiguracji bazy danych master-slave.
* EDYCJA: Po przeczytaniu nieco więcej binlog_format
, wydaje się, że ROW lub MIXED byłyby całkowicie dopuszczalne, jednak moim głównym problemem jest to, że nie mogę odtworzyć tego problemu w interfejsie MySQL CLI, aby sprawdzić, czy MIXED/ROW może rozwiązać ten problem?
Tak, myślę, że po prostu przejście na "mieszane" jest odpowiedzią i rozwiązało problem w porządku dla mnie. Chciałbym móc replikować na CLI, ale teraz działa :) – DanH