如何重新索引计数器以在MySQL中连续递增?

时间:2017-02-11 05:35:59

标签: mysql sql

我有这样的行:

+----+------+-------+
| id | name | order |
+----+------+-------+
|  1 | foo  |     2 |
|  2 | bar  |     4 |
|  3 | jam  |     1 |
|  4 | ban  |     3 |
+----+------+-------+

假设,如果我要删除行3,我们就会这样:

+----+------+-------+
| id | name | order |
+----+------+-------+
|  1 | foo  |     2 |
|  2 | bar  |     4 |
|  4 | ban  |     3 |
+----+------+-------+

我想重置表格中的顺序,因此它变为:

+----+------+-------+
| id | name | order |
+----+------+-------+
|  1 | foo  |     1 |
|  2 | bar  |     3 |
|  4 | ban  |     2 |
+----+------+-------+

即。从1开始逐步上升,同时不改变"顺序"。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

考虑到order列是唯一的,您可以将用户变量与更新连接一起使用,如下所示:

update t t1
join (
    select id,
        @rn := @rn + 1 rn
    from (
        select *
        from t
        order by `order`
        ) t
    cross join (
        select @rn := 0
        ) t2
    ) t2 on t1.id = t2.id

set t1.`order` = t2.rn;

答案 1 :(得分:1)

就像GurV的回答一样,但更简单:

SET @rn := 0;

UPDATE MyTable
SET `order` = (@rn:=@rn+1)
ORDER BY `order`;

说明:将会话变量@rn初始化为零。按order按顺序为每一行运行更新,并设置order列(顺便说一句,我建议选择与关键字不同的列名)。

您为该列设置的值是一个表达式,它使用变量赋值语法,因此对于每一行,它会增加变量。