在 MySQL 5.7 中更新列枚举行号

Posted

技术标签:

【中文标题】在 MySQL 5.7 中更新列枚举行号【英文标题】:Update column enumerating row number in MySQL 5.7 【发布时间】:2021-02-25 21:17:32 【问题描述】:

我在 mysql 5.7 中遇到了一个查询。 简化,我有一个像这样的临时表:

guid  B   C
 2   aa  55
 5   ab  66
 7   ac  77
 9   ad  88

我想要做的是,将列 guid 变成从 1 开始的枚举,同时不触及其他列中的任何数据:

guid  B   C
 1   aa  55
 2   ab  66
 3   ac  77
 4   ad  88

我一直在寻找涉及 ROW_NUMBER 和 ROW_ID 的解决方案,但我的语法不被接受:

UPDATE temp_table
SET temp_table.guid = temp_table.New_guid
FROM (
      SELECT guid, ROW_NUMBER() OVER (ORDER BY [guid]) AS New_guid
      FROM temp_table
      ) x

我尝试采用this question 的上述内容,但它一直说“FROM 在此位置不是有效输入”。

【问题讨论】:

【参考方案1】:

你可以使用变量:

set @rn = 0;

update temp_table
    set guid = (@rn := @rn + 1)
    order by guid;

如果您实际上并不关心当前的排序,您可以使用:

update temp_table tt cross join
       (select @rn := 0) params
    set tt.guid = (@rn := @rn + 1);

很遗憾,当update 具有join 时,您不能使用order by

【讨论】:

之前没有考虑过变量的使用。非常感谢,这很有教育意义!

以上是关于在 MySQL 5.7 中更新列枚举行号的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 5.7 获取行号

在knex迁移中更新枚举列类型

播放光滑的更新枚举列

如何将数字枚举列转换为 tinyint?

计算行数或枚举行号,以便我可以遍历它们 - 为啥这是一种反模式?

告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列