如何订购这样的行:
如果我有这些带有数字 ID 的行:
1 | 2 | 3 | 100 | 4
查询将像这样对它们进行排序:
1 | 2 | 3 | 4 | 5
将 ID 为100的行更新为4,将 ID 为 4的行更新为5
换句话说
更新不按顺序排列的行。
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 进行排序充其量是没有意义的,并且可能会导致数据引用的混淆。