我想更新表格中的行,从1001开始到下一个1000.
我尝试了以下查询:
UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
此外,我尝试更新的行对于具有数据类型INTEGER的列p_id具有Null值。由于这个原因,我甚至无法使用以下查询进行更新:
UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
答案 0 :(得分:102)
如果要使用MySQL中的限制更新多行,可以使用此结构:
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
)
答案 1 :(得分:24)
处理null时,=
与空值不匹配。您可以使用IS NULL
或IS NOT NULL
UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3 WHERE panel_id IS NULL
LIMIT
可与UPDATE
一起使用,但仅限row count
答案 2 :(得分:7)
我建议两步查询
我假设你有一个自动增量主键,因为你说你的PK是(max + 1),这听起来像是一个autioincrementing键的定义。
我正在调用PK id
,用你的PK调用替代。
1 - 找出第1000列的主键编号。
SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000
2 - 更新表格。
UPDATE smartmeter_usage.users_reporting SET panel_id = 3
WHERE panel_id IS NULL AND id >= @id
ORDER BY id
LIMIT 1000
请测试我是否没有犯一个错误的错误;您可能需要在某处添加或减去1.
答案 3 :(得分:3)
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000
此查询不正确(或者至少我不知道在UPDATE查询中使用限制的可能方法),您应该在主键上放置where
条件(假设您有一个auto_increment列作为主键,如果没有提供更多细节):
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000
对于第二个查询,您必须使用IS
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null
编辑 - 如果你的primary_key是一个名为MAX + 1的列,你应该查询(在评论中正确陈述了反引号):
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000
使用MAX + 1从1001到2000(包括1001和2000)更新行
答案 4 :(得分:1)
您应该使用IS而不是=来比较NULL。
UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null
应用于更新时,MySQL中的LIMIT
子句不允许指定偏移量。
答案 5 :(得分:1)
你可以使用LIMIT,而不是使用LIMIT和OFFSET。
答案 6 :(得分:1)
除了上述嵌套方法之外,您还可以在同一张表上使用LIMIT
完成JOIN
的应用:
UPDATE `table_name`
INNER JOIN (SELECT `id` from `table_name` order by `id` limit 0,100) as t2 using (`id`)
SET `name` = 'test'
以我的经验,mysql查询优化器更喜欢这种结构。
答案 7 :(得分:0)
如果您打算限制更新,则应高度考虑使用ORDER BY
,否则它将在表的排序中更新,这可能不正确。
但正如Will A所说,它只允许限制row_count,而不是偏移。
答案 8 :(得分:0)
对于人们来说,通过搜索“更新限制MySQL”来获得这篇帖子,是为了避免在面对具有多表语法的safe update mode
时关闭update
。
对于多表语法,UPDATE更新每个名为的表中的行 在满足条件的table_references中。在这种情况下,订购 不能使用BY和LIMIT。
https://stackoverflow.com/a/28316067/1278112
我认为这个答案很有帮助。举个例子
更新客户SET countryCode ='美国' WHERE country ='USA'; -出现错误,您只需编写:
更新客户SET countryCode ='美国' 在哪里(国家/地区=“美国”且customerNumber <> 0); -由于customerNumber是主键,因此不会再出现错误1175。
我想要的东西,但会引发错误代码1175。
UPDATE table1 t1
INNER JOIN
table2 t2 ON t1.name = t2.name
SET
t1.column = t2.column
WHERE
t1.name = t2.name;
工作版
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);
这真的很简单而优雅。由于原始答案没有引起太多关注(投票),因此我发布了更多解释。希望这可以帮助其他人。