如何按自然顺序按ID重新排序行

时间:2013-08-26 17:25:12

标签: mysql sql

如何订购这样的行:

如果我有这些带有数字ID的行:

  

1 | 2 | 3 | 100 | 4

查询将按如下顺序排序:

  

1 | 2 | 3 | 4 | 5

将ID为 100 的行更新为 4 ,将ID 4 的行更新为 5 < / p>

换句话说

更新不按顺序排列的行。

1 个答案:

答案 0 :(得分:4)

mysql> create table t (i int);

mysql> insert into t values (1), (2), (3), (100), (4);

mysql> select * from t;
+------+
| i    |
+------+
|    1 |
|    2 |
|    3 |
|  100 |
|    4 |
+------+

mysql> set @seq := 0;

mysql> update t set i = (@seq:=@seq+1);
Rows matched: 5  Changed: 2  Warnings: 0

mysql> select * from t;
+------+
| i    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

来自@ChristianKuetbach的评论提出了一个很好的观点。我回答了一种方法来完成问题所要求的问题,但问题并不清楚这些ID值是否适用于表的主键。

如果这些值是主键ID,那么您应该重新考虑以您描述的方式重新编号。主键值必须是唯一的,但不是连续的。您永远不应该依赖自动生成的数字是连续的,甚至是依次。由于DELETE,ROLLBACK或仍然生成ID的INSERT失败,您总是可以丢失数字。试图强制对ID进行排序最多也是毫无意义的,并且可能会导致数据引用的混乱。