2009-10-03 27 views
28
UPDATE messages set test_read =1 
     WHERE userid='xyz' 
     ORDER BY date_added DESC 
     LIMIT 5, 5 ; 

Tôi cố gắng để sử dụng truy vấn này để cập nhật một bộ 5 hàng sử dụng giới hạn nhưng mysql được hiển thị một error..The dưới đây đang làm việccập nhật nhiều hàng bằng cách sử dụng giới hạn trong mysql?

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

tại sao người đầu tiên không làm việc?

Trả lời

53

Nếu bạn thực sự phải làm theo cách này, bạn có thể sử dụng một cái gì đó như thế này:

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 
); 
+1

Bạn có thực sự cần chọn đôi lồng nhau không? Trong ms sql nó sẽ chỉ là một cái gì đó như "Nơi id trong (SELECT TOP 5 id TỪ tin nhắn ORDER BY date_added DESC)" –

+19

Có, MySQL không cho phép bạn cập nhật một bảng mà nó chọn. Lựa chọn lồng bổ sung buộc nó để lưu kết quả vào một bảng tạm thời. –

+2

Khi bạn hỏi 'nếu bạn thực sự phải làm theo cách này', bạn ngụ ý có một lựa chọn tốt hơn để cập nhật hồ sơ dựa trên thứ hạng được đưa ra bởi thứ tự của một trong các trường của nó? – deed02392

5

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

Các tài liệu nói rằng bất kỳ câu lệnh UPDATE với LIMIT khoản được coi là không an toàn kể từ khi thứ tự của các hàng bị ảnh hưởng không phải là được xác định: http://dev.mysql.com/doc/refman/5.1/en/replication-features-limit.html

Tuy nhiên, nếu "ORDER BY PK" được sử dụng, thứ tự các hàng được xác định và câu lệnh như vậy có thể được ghi lại dưới định dạng tuyên bố mà không có bất kỳ cảnh báo nào.

Các vấn đề liên quan