MySQL - 使用LIMIT进行UPDATE查询

sra*_*l07 61 mysql limit sql-update

我想更新表格中的行,从1001开始到下一个1000.

我尝试了以下查询:

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
Run Code Online (Sandbox Code Playgroud)
  1. 这给了我语法错误.它是否正确?我在这里犯了什么错
  2. 我们能以这种方式限制更新吗?

此外,我尝试更新的行具有列p_id的Null值,该列具有数据类型INTEGER.由于这个原因,我甚至无法使用以下查询进行更新:

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
Run Code Online (Sandbox Code Playgroud)
  1. 我上面的查询是否正确?
  2. 可以做些什么来实现这一目标?

小智 112

如果要在MySQL中使用limit更新多行,可以使用以下结构:

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
)
Run Code Online (Sandbox Code Playgroud)

  • MySQL 5.5不支持IN/ALL/ANY/SOME子查询中的LIMIT:错误代码1235 (21认同)
  • @FiveO在MySQL 5.5.34上对我很好.没有嵌套的子查询(反常的`SELECT id FROM(SELECT id FROM ...)`构造)我得到`ERROR 1235(42000):这个版本的MySQL还不支持'LIMIT&IN/ALL/ANY/SOME subquery'`,但是如果我在这里显示两个选择,则查询有效. (7认同)
  • 这有效,但我无法理解它的工作原理:/ (3认同)
  • 顺便说一下,对于 Postgres 9.4,这种代码不需要外部的 `SELECT id FROM (` ... `) tmp ` 就可以工作。谢谢。似乎这应该是公认的答案。 (3认同)

Sha*_*ngh 27

处理null时,=与null值不匹配.你可以使用IS NULLIS NOT NULL

UPDATE `smartmeter_usage`.`users_reporting` 
SET panel_id = 3 WHERE panel_id IS NULL
Run Code Online (Sandbox Code Playgroud)

LIMIT可以UPDATErow count唯一一起使用

  • @ srahul07:因为NULL不是实数值,而`=`检查两个值的相等性.因此`=`不匹配null. (2认同)

Jer*_*rry 11

除了上面的嵌套方式,你还可以在同一张表上完成LIMITusing的应用JOIN

UPDATE `table_name`
INNER JOIN (SELECT `id` from `table_name` order by `id` limit 0,100) as t2 using (`id`)
SET `name` = 'test'
Run Code Online (Sandbox Code Playgroud)

根据我的经验,mysql 查询优化器对这种结构更满意。


Joh*_*ica 9

我建议两步查询

我假设你有一个自动增量主键,因为你说你的PK是(max + 1),这听起来像是一个autioincrementing键的定义.
我打电话给PK id,替换你所谓的PK.

1 - 计算列1000的主键编号.

SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000
Run Code Online (Sandbox Code Playgroud)

2 - 更新表格.

UPDATE smartmeter_usage.users_reporting SET panel_id = 3 
WHERE panel_id IS NULL AND id >= @id 
ORDER BY id 
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

请测试我是否没有做出一个错误的错误; 您可能需要在某处添加或减去1.