【问题标题】:Update every row with an incremental value in Mysql在 Mysql 中使用增量值更新每一行
【发布时间】:2022-01-22 01:36:08
【问题描述】:

使用以下查询,我尝试根据最后一行使用递增的数字填充列的空值。

select @i := (
    SELECT code 
    FROM products  
    WHERE code <> '' 
    ORDER BY products.id_product  DESC 
    LIMIT 1
);

UPDATE products SET code = @i + 1 
WHERE code = '' 
ORDER BY id_product;

所以,如果最后一个代码是 41100,那么下一行有一个空的 CODE 列应该是 41101,下一个是 41102,以此类推。 不幸的是,它使用下一个可用代码(例如 41101)填充所有空记录,并且没有按应有的方式递增数字。

我的错在哪里? 提前致谢。

【问题讨论】:

    标签: mysql auto-increment


    【解决方案1】:

    您的更新不会为每一行增加@i 的值。它计算每一行的常数值@i+1,而不改变@i的值。

    我想你想要的是这样的:

    update products set code = (@i := @i + 1) 
    where code = '' order by id_product;`
    

    这意味着每次计算表达式时,都会为 @i 分配一个新值,该值是之前的 @i 值加一。

    请注意,MySQL 官方不建议以这种方式使用:=。见https://dev.mysql.com/doc/refman/8.0/en/user-variables.html

    涉及用户变量的表达式的计算顺序未定义。例如,不能保证SELECT @a, @a:=@a+1 先评估@a,然后再执行分配。

    在您的示例中,它应该可以工作,但更复杂的示例可能无法达到您的预期。

    【讨论】:

    • 非常感谢您的回复,终于解决了,就像编辑我自己的查询一样,如下。在更新命令中,set 参数应该是这样的“set code = (select @i := @i + 1)”
    • 你不需要那个表达式中的“select”。
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2011-01-16
    • 2023-03-24
    • 1970-01-01
    • 2019-03-04
    • 2014-01-19
    • 2018-12-06
    相关资源
    最近更新 更多