2013-06-12 6 views
8

全エラー以来の文形式を使用してバイナリログに書き込ま危険な声明:警告:BINLOG_FORMAT = STATEMENT

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. 

私はジャンゴから生のSQLを実行しようとしたときに、このエラーを取得するように見えます。 MySQL CLIクライアントから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; 

これの目的は、レコードを注文すると、データベースにこの順序を保持するために、重みに連番を適用することである:ここではSQLです。

私はしかし、それはまだ正常に実行され、私は、問題を再現できるかどうかを確認するために、クライアント内でこのコマンドを実行しようとしました:

mysql> SET GLOBAL binlog_format = 'STATEMENT'; 

はまた、私はどちらかで動作するようにSQLを解決したり、書き換えすることが重要です最終的なアプリケーションとしてのこの制約は、ほぼ確実にマスター・スレーブ・データベースの設定で実行されます。

*編集:binlog_formatを少し読んだあと、ROWまたはMIXEDは完全に受け入れられるようですが、私の主な関心事はMySQLのCLIでこの問題を再現できないため、MIXED/ROW infactこの問題を解決することができますか?

答えて

8

エラーメッセージをスローしないようにsqlを書き直す方法はありません。スレーブはマスターとは異なる行を持つかもしれないので、どんな種類の注文でもそのメッセージがスローされます。 mixedは、statementで複製するのが安全でない場合にのみ、rowベースの複製に切り替えるので、それを解決します。

+0

はい私は単純に 'mixed'に切り替えるのが答えだと思います。問題は解決しました。私はCLIで複製することができますが、それは今動作します:) – DanH