>我有这样的行:
+----+------+-------+
| 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 逐步上升,同时不改变"顺序"。
我该怎么做?
考虑到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;
就像 GurV 的答案一样,但更简单:
SET @rn := 0;
UPDATE MyTable
SET `order` = (@rn:=@rn+1)
ORDER BY `order`;
说明:将会话变量初始化为零@rn。按顺序对每一行运行更新 order
,并设置order
列(顺便说一下,我建议选择一个与关键字不同的列名(。
将该列设置为的值是一个表达式,它使用变量赋值语法,因此对于每一行,它都会递增变量。