Avertissement: Dangereux déclaration écrite dans le log binaire à l'aide de déclaration format depuis BINLOG_FORMAT = INSTRUCTION

D'erreur complet:

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.

Je ne semble pas pour obtenir cette erreur lorsque vous essayez d'exécuter SQL brut de Django. Si je lance le SQL de MySQL client CLI je n'obtiens pas la même erreur. Voici le 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;

Le but est de trier les enregistrements, et d'appliquer un numéro séquentiel pour le poids afin de persister cette commande dans la base de données.

J'ai essayé de lancer cette commande dans le client pour voir si je peux reproduire le problème cependant, il fonctionne toujours avec succès:

mysql> SET GLOBAL binlog_format = 'STATEMENT';

Aussi, il est important de résoudre ou de réécrire le code SQL de travail avec cette contrainte que l'application finale est presque certainement va courir à travers un maître-esclave configuration de base de données.

*EDIT: Après avoir lu un peu plus binlog_format, il semble que la LIGNE ou MIXTE, serait parfaitement acceptable, mais ma principale préoccupation est de ne pas pouvoir reproduire ce problème dans la base de données MySQL CLI afin de vérifier si l'MIXTE/LIGNE peut en effet résoudre ce problème?

OriginalL'auteur DanH | 2013-06-12