-2

如何订购这样的行:

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

1 | 2 | 3 | 100 | 4

查询将像这样对它们进行排序:

1 | 2 | 3 | 4 | 5

将 ID 为100的行更新为4,将 ID 为 4的行更新为5

换句话说

更新不按顺序排列的行。

4

1 回答 1

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,那么您应该重新考虑按照您描述的方式重新编号。主键值必须是唯一的,但不能连续。你永远不应该依赖自动生成的数字是连续的,甚至是有序的。由于仍会生成 ID 的 DELETE、ROLLBACK 或失败的 INSERT,您总是会丢失数字。试图强制对 ID 进行排序充其量是没有意义的,并且可能会导致数据引用的混淆。

于 2013-08-26T21:11:21.563 回答