web-dev-qa-db-fra.com

mettre à jour plusieurs lignes en utilisant limit dans mysql?

    UPDATE messages set test_read =1 
        WHERE userid='xyz' 
        ORDER BY date_added DESC  
        LIMIT 5, 5 ;

J'essaie d'utiliser cette requête pour mettre à jour un ensemble de 5 lignes en utilisant limit, mais mysql affiche une erreur .. Celui ci-dessous fonctionne

    UPDATE messages set test_read =1 
        WHERE userid='xyz' 
        ORDER BY date_added DESC  
        LIMIT 5 ;

pourquoi le premier ne fonctionne pas?

28
halocursed

Si vous devez vraiment le faire de cette façon, vous pouvez utiliser quelque chose comme ceci:

 UPDATE messages SET test_read=1
 WHERE id IN (
     SELECT id FROM (
         SELECT id FROM messages 
         ORDER BY date_added DESC  
         LIMIT 5, 5
     ) tmp
 );
53

http://bugs.mysql.com/bug.php?id=42415

La documentation indique que toute instruction UPDATE avec la clause LIMIT est considérée comme non sûre car l'ordre des lignes affectées n'est pas défini: http://dev.mysql.com/doc/refman/5.1/en/replication-features- limit.html

Cependant, si "ORDER BY PK" est utilisé, l'ordre des lignes est défini et une telle instruction peut être enregistrée au format d'instruction sans aucun avertissement.

5
Svetoslav Genov