小编典典

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

sql

我如何排序这样的行:

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

1 | 2 | 3 | 100 | 4

查询将对它们进行排序,如下所示:

1 | 2 | 3 | 4 | 5

将ID为 100*4 的行和ID为 45 的行更新 *

换一种说法

更新不按顺序的行。


阅读 253

收藏
2021-04-15

共1个答案

小编典典

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或失败的INSERT仍会生成ID,因此始终会丢失数字。试图强制对ID进行排序最多是毫无意义的,并且可能会导致数据引用混乱。

2021-04-15