首页 > 解决方案 > Mysql通过删除差异更新列

问题描述

我不知道如何用语言来解释这一点。所以请让我举个例子。假设按order列排序的项目表:

| id | name | order |
| 5  |   x  |   1   |
| 2  |   y  |   3   |
| 3  |   z  |   4   |
| 7  |   p  |   8   |

我想以order一种方式更新列,其中每个列与它们的连续行有 1 个差异,同时保持顺序。期望的结果:

| id | name | order |
| 5  |   x  |   1   |
| 2  |   y  |   2   |
| 3  |   z  |   3   |
| 7  |   p  |   4   |

编辑:选择 row_number() 不是我的解决方案,因为我想更改订单,而且我不只是在寻找行号。

标签: mysqlsqldatabasesql-update

解决方案


在 MySQL8 中,只需使用row_number()

select t.*,
    row_number() over(order by ord) as new_ord
from mytable t

这表明可以在需要时轻松地即时计算信息,并导致发现存储此类派生信息可能不是一个好主意。在添加或删除新行时保持最新是很乏味的。

相反,您可以使用上述查询,或将其放在视图中:

create view myview as
select t.*,
    row_number() over(order by ord) as new_ord
from mytable t

注意:order是语言关键字,我用它ord代替。

如果您真的需要update, 用于一次性任务,例如:

update mytable t
inner join (
    select id, row_number() over(order by ord) as new_ord from mytable
) t1 on t1.id = t.id
set t.ord = t1.new_ord

推荐阅读