web-dev-qa-db-ja.com

MySQLの制限を使用して複数の行を更新しますか?

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

このクエリを使用して、制限を使用して5行のセットを更新しようとしていますが、mysqlでエラーが表示されています。以下のコードは機能しています

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

なぜ最初のものが機能しないのですか?

28
halocursed

本当にこの方法で行う必要がある場合は、次のようなものを使用できます。

 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

ドキュメントには、影響を受ける行の順序が定義されていないため、LIMIT句を含むUPDATEステートメントは安全でないと見なされていると記載されています。 http://dev.mysql.com/doc/refman/5.1/en/replication-features- limit.html

ただし、「ORDER BY PK」を使用すると、行の順序が定義され、そのようなステートメントは警告なしにステートメント形式で記録されます。

5
Svetoslav Genov