删除后更新排序键

时间:2008-11-14 16:18:25

标签: mysql sql sorting sql-order-by

我有一个包含字段sort_id的表格。在该字段中,存在从1到n的数字,它们定义数据集的顺序。 现在我想删除一些元素,然后我想重新排序表。因此,我需要一个“查找”间隙的查询,并根据修改更改sort_id字段。

当然,我可以这样做:

SELECT sort_id FROM table WHERE id = 5

然后保存sort_id,之后:

DELETE FROM table WHERE id = 5
UPDATE table SET sort_id = sort_id - 1 WHERE sort_id > {id from above}

但我想一步完成重新排序过程。

3 个答案:

答案 0 :(得分:3)

Mladen和Arvo有很好的想法,但遗憾的是在MySQL中你不能SELECTUPDATE同一个语句中的同一个表(即使在子查询中)。这是MySQL的一个已知限制。

这是一个使用MySQL用户变量的解决方案:

SET @i := 0;
UPDATE mytable
SET sort_id = (@i := @i + 1)
ORDER BY sort_id;

对于它的价值,无论如何我都不会这么做。如果您的sort_id仅用于排序而不是一种“行号”,则在删除id=6行后,行仍按排序顺序排列。这些值不一定必须连续进行排序。

答案 1 :(得分:0)

for sql server 2005: 这就是你得到新序列的方式:

SELECT row_number() over(order by sort_id) as RN
FROM table

更新表意味着您应该将该选择加入到您的更新中:

update t1
set sort_id = t2.RN
FROM table t1 
     join (SELECT row_number() over(order by sort_id) as RN FROM table) t2 
        on t1.UniqueId = t2.UniqueId

答案 2 :(得分:0)

我不知道MySQL的语法变化,也无法实时测试查询,但接下来的事情应该至少给你一个想法:

update table t1
set sort_id = (select count * from table t2 where t2.sort_id <= t1.sort_id)