2011-06-09 52 views
44

Tôi muốn cập nhật hàng trong bảng của tôi với bắt đầu từ 1001 tới 1000. tiếp theoMySQL - truy vấn UPDATE với LIMIT

Tôi đã thử với truy vấn sau đây:

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000 
  1. này đem lại cho tôi lỗi cú pháp . Điều này có đúng không? Tôi có làm gì sai ở đây không
  2. Chúng tôi có thể giới hạn cập nhật theo cách này không?

Ngoài ra, các hàng mà tôi đang cố gắng cập nhật có giá trị Null cho cột p_id đang có kiểu dữ liệu INTEGER. Do đó tôi thậm chí không thể cập nhật sử dụng truy vấn sau đây:

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null 
  1. là truy vấn trên của tôi có đúng không?
  2. Có thể làm gì để đạt được điều này?

Trả lời

19

Khi giao dịch với null = không phù hợp với các giá trị null bạn có thể sử dụng IS NULL hoặc IS NOT NULL

UPDATE `smartmeter_usage`.`users_reporting` 
SET panel_id = 3 WHERE panel_id IS NULL 

LIMIT có thể được sử dụng với UPDATE nhưng với row count chỉ

+0

Cảm ơn bạn đã trả lời. Bạn có thể vui lòng cho tôi một cái nhìn sâu sắc về lý do tại sao IS NULL khác với = null. Cũng thế. chính xác những gì IS NULL để tìm giá trị null? – srahul07

+2

@ srahul07: Vì NULL không phải là giá trị thực và '=' kiểm tra tính bình đẳng của hai giá trị. Do đó '=' không khớp với null. –

+0

@Framework, giới hạn cập nhật với 'số lượng hàng' không hoạt động đối với phiên bản mysql 5.1.X –

0

Bạn nên sử dụng là khá hơn = để so sánh với NULL.

UPDATE `smartmeter_usage`.`users_reporting` 
SET panel_id = 3 
WHERE panel_id IS null 

Điều khoản LIMIT trong MySQL khi áp dụng cho bản cập nhật không cho phép chỉ định chênh lệch.

+0

Điều này đã giúp tôi trong một tình huống tương tự nhưng khác nhau - truy vấn phải đọc" cập nhật tập_tin_tập_tin_id = n giới hạn 1000 "thay vì" cập nhật bộ my_table process_id = n giới hạn 0,1000 " – rrrhys

2
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000 

Truy vấn này là không đúng (hoặc ít nhất là tôi không biết một cách có thể sử dụng giới hạn trong các truy vấn UPDATE), bạn nên đặt một điều kiện where trên bạn khóa chính (điều này giả sử bạn có một cột auto_increment như khóa chính của bạn, nếu không cung cấp thêm chi tiết):

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000 

Đối với truy vấn thứ hai bạn phải sử dụng lÀ

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null 

EDIT - nếu primary_key của bạn là một cột tên là MAX + 1 bạn truy vấn nên (với backticks như đã nêu một cách chính xác trong các bình luận):

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000 

Để cập nhật các hàng với MAX + 1 từ năm 1001 đến năm 2000 (bao gồm cả 1001 và 2000)

+2

Bạn giả định rằng anh ta có một auto_increment trên bảng, mà có thể không phải là trường hợp, cũng không phải là một chuỗi số không gián đoạn. – jishi

+0

tốt, vâng, tất nhiên tôi đang làm giả định đó, tôi sẽ cập nhật câu trả lời với điều đó, chờ đợi thêm thông tin! :) –

+0

Cảm ơn bạn đã phản hồi. Trên thực tế, khóa chính là MAX + 1. – srahul07

0

Bạn rất nên xem xét sử dụng một ORDER BY nếu bạn định giới hạn UPDATE của bạn, bởi vì nếu không nó sẽ cập nhật theo thứ tự của bảng, có thể không chính xác.

Nhưng như A đã nói, nó chỉ cho phép giới hạn trên hàng_count, không bù đắp.

7

tôi sẽ đề nghị một truy vấn hai bước

Tôi giả sử bạn có một khóa chính autoincrementing vì bạn nói PK của bạn là (max + 1) mà âm thanh như định nghĩa của một chính autioincrementing.
Tôi đang gọi PK id, thay thế bằng bất kỳ PK nào của bạn được gọi.

1 - tìm ra các số khóa chính cho cột 1000.

SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000 

2 - cập nhật bảng.

UPDATE smartmeter_usage.users_reporting SET panel_id = 3 
WHERE panel_id IS NULL AND id >= @id 
ORDER BY id 
LIMIT 1000 

Vui lòng kiểm tra xem liệu tôi có không mắc lỗi từng lần một hay không; bạn có thể cần cộng hoặc trừ 1 ở đâu đó.

74

nếu bạn muốn cập nhật nhiều hàng sử dụng giới hạn trong mysql ... sử dụng này

UPDATE table_name SET name='test' 
    WHERE id IN (
     SELECT id FROM (
      SELECT id FROM table_name 
      ORDER BY id ASC 
      LIMIT 0, 10 
     ) tmp 
    ); 
+15

MySQL 5.5 không hỗ trợ LIMIT trong IN/ALL/ANY/MỘT SỐ truy vấn phụ: Mã lỗi 1235 – FiveO

+5

@FiveO Hoạt động tốt cho tôi trên MySQL 5.5.34. Nếu không có truy vấn con lồng nhau (hàm SELECT SELECT TỪ (SELECT id FROM ...) 'construct) tôi nhận được' ERROR 1235 (42000): Phiên bản MySQL này chưa hỗ trợ 'LIMIT & IN/ALL/ANY/SOME subquery'', nhưng nếu tôi bao gồm cả hai lựa chọn như được hiển thị ở đây, truy vấn hoạt động. –

+2

Điều này làm việc, nhưng tôi không thể có được lý do tại sao nó hoạt động:/ – Vertig0

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