如何订购这样的行:
如果我有这些带有数字ID的行:
1 | 2 | 3 | 100 | 4
查询将按如下顺序排序:
1 | 2 | 3 | 4 | 5
将ID为 100 的行更新为 4 ,将ID 4 的行更新为 5 < / p>
换句话说
更新不按顺序排列的行。
答案 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进行排序最多也是毫无意义的,并且可能会导致数据引用的混乱。