answer
30
Khi xử lý null, =
không khớp với các giá trị null. Bạn có thể sử dụng IS NULL
hoặcIS 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 sự row count
chỉ
30 hữu ích 3 bình luận chia sẻ
answer
134
Nếu bạn muốn cập nhật nhiều hàng bằng cách sử dụng giới hạn trong MySQL, bạn có thể sử dụng cấu trúc 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
]
134 hữu ích 4 bình luận chia sẻ
answer
11
Tôi sẽ đề xuất một truy vấn hai bước
Tôi giả định rằng bạn có một khóa chính tự động gia tăng vì bạn nói PK của bạn là [tối đa + 1], điều này nghe giống như định nghĩa của một khóa tăng thêm.
Tôi đang gọi PK id
, hãy thay thế
bằng bất cứ tên PK nào của bạn.
1 - tìm ra 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 tôi có mắc lỗi không; bạn có thể cần thêm hoặc bớt 1 ở đâu đó.
11 hữu ích 0 bình luận chia sẻ
answer
9
Ngoài cách tiếp cận lồng nhau ở trên, bạn có thể thực hiện ứng dụng của việc LIMIT
sử
dụng JOIN
trên cùng một bảng:
UPDATE `table_name`
INNER JOIN [SELECT `id` from `table_name` order by `id` limit 0,100] as t2 using [`id`]
SET `name` = 'test'
Theo kinh nghiệm của tôi, trình tối ưu hóa truy vấn mysql hạnh phúc hơn với cấu trúc này.
9 hữu ích 0 bình luận chia sẻ
answer
4
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000
Truy vấn này không đúng [hoặc ít nhất là tôi không biết cách khả thi để sử dụng giới hạn trong truy vấn CẬP NHẬT], bạn nên đặt where
điều kiện cho bạn khóa chính [điều này giả sử bạn có cột
auto_increment làm khóa chính, nếu không cung cấp biết 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 IS
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null
CHỈNH SỬA - nếu khóa_ chính của bạn là một cột có tên MAX + 1, bạn nên truy vấn [với dấu gạch ngược như đã nêu chính xác trong nhận xét]:
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000
Để cập nhật các hàng có MAX + 1 từ 1001 ĐẾN 2000 [bao gồm 1001 và 2000]
4 hữu ích 5 bình luận chia sẻ
answer
4
Bạn có thể làm điều đó với LIMIT, không chỉ với LIMIT và OFFSET.
4 hữu ích 0 bình luận chia sẻ
answer
1
Bạn nên sử dụng IS thay vì = để so sánh với NULL.
UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null
Các LIMIT
điều khoản trong MySQL khi áp dụng cho một bản cập nhật không cho phép một bù đắp được xác định.
1 hữu ích 1 bình luận chia sẻ
answer
0
Bạn rất nên cân nhắc việc sử dụng ORDER BY
nếu bạn có ý định HẠN CHẾ CẬP NHẬT của mình, bởi vì nếu không nó sẽ cập nhật theo thứ tự của bảng, điều này có thể không chính xác.
Nhưng như Will A đã nói, nó chỉ cho phép giới hạn trên row_count, không bù đắp.
0 hữu ích 0 bình luận chia sẻ
answer
0
Đối với những người nhận được bài đăng này bằng cách tìm kiếm "giới hạn cập nhật MySQL" cố gắng tránh tắt safe update mode
khi đối mặt update
với cú pháp nhiều bảng.
Kể từ khi trạng thái văn bản chính thức
Đối với cú pháp nhiều bảng, UPDATE cập nhật các hàng trong mỗi bảng có tên trong table_references đáp ứng các điều kiện. Trong trường hợp này, không thể sử dụng ORDER BY và LIMIT.
//stackoverflow.com/a/28316067/1278112
Tôi
nghĩ câu trả lời này khá hữu ích. Nó đưa ra một ví dụ
CẬP NHẬT khách hàng SET countryCode = 'USA' WHERE country = 'USA'; - mà đưa ra lỗi, bạn chỉ cần viết:
CẬP NHẬT khách hàng SET countryCode = 'USA' WHERE [country = 'USA' AND customerNumber 0]; - Vì customerNumber là khóa chính nên bạn không gặp lỗi 1175 nào nữa.
Những gì tôi muốn nhưng sẽ làm tăng mã lỗi 1175.
UPDATE table1 t1
INNER JOIN
table2 t2 ON t1.name = t2.name
SET
t1.column = t2.column
WHERE
t1.name = t2.name;
Phiên bản làm việc
UPDATE table1 t1
INNER JOIN
table2 t2 ON t1.name = t2.name
SET
t1.column = t2.column
WHERE
[t1.name = t2.name and t1.prime_key !=0];
Mà thực sự là đơn giản và thanh lịch. Vì câu trả lời ban đầu không nhận được quá nhiều sự chú ý [bình chọn], tôi đăng thêm lời giải thích. Hy vọng điều này có thể giúp những người khác.
0 hữu ích 0 bình luận chia sẻ