MySQL - 使用LIMIT进行UPDATE查询

时间:2011-06-09 07:55:35

标签: mysql limit sql-update

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

我尝试了以下查询:

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
  1. 这给了我语法错误。它是否正确?我在这里犯了什么错误。
  2. 我们可以这样限制更新吗?
  3. 此外,我尝试更新的行对于具有数据类型INTEGER的列p_id具有Null值。由于这个原因,我甚至无法使用以下查询进行更新:

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

9 个答案:

答案 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 NULLIS 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

the offical document状态起

  

对于多表语法,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);

这真的很简单而优雅。由于原始答案没有引起太多关注(投票),因此我发布了更多解释。希望这可以帮助其他人。