完全なエラー:
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.
Django から生の SQL を実行しようとしたときにのみ、このエラーが発生するようです。MySQL CLI クライアントから SQL を実行しても、同じエラーは発生しません。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;
これの目的は、レコードを並べ替え、重みに連番を適用して、データベース内でこの順序を維持することです。
クライアント内でこのコマンドを実行して、問題を再現できるかどうかを確認しましたが、それでも正常に実行されます。
mysql> SET GLOBAL binlog_format = 'STATEMENT';
また、最終的なアプリケーションはほぼ確実にマスター/スレーブ データベース セットアップで実行されるため、この制約に対応するように SQL を解決するか書き直すことが重要です。
*EDIT:もう少し読んだ後binlog_format
、ROWまたはMIXEDが完全に受け入れられるように見えますが、私の主な懸念は、MIXED / ROWが実際にこの問題を解決できるかどうかをテストするために、MySQL CLIでこの問題を再現できないことです?