6

我有一张如下表,

| id  | name   | color  |
------+--------+---------
| 1   | pear   | green  |
| 2   | apple  | red    |
| 3   | banana | yellow |
| 4   | grape  | purple |

我想使用“名称”列按字母顺序重新排序,并用这个新顺序重置 id(自动增量),最终得到以下结果

| id  | name   | color  |
------+--------+---------
| 1   | apple  | red    |
| 2   | banana | yellow |
| 3   | grape  | purple |
| 4   | pear   | green  |

问题:我怎样才能用 MYSQL 做到这一点?

4

5 回答 5

15

重置自动增量的最简洁方法是创建另一个表。

MySQL 提供CREATE TABLE LIKERENAME TABLE一些有用的命令。

CREATE TABLE table2 LIKE table1;

INSERT INTO table2
  SELECT * FROM table1 ORDER BY name;

DROP TABLE table1;

RENAME TABLE table2 TO table1;
于 2009-12-05T13:27:33.713 回答
9

我能问一下你为什么要这样做吗?

如果有人修改任何名称值或插入新行,它会弄乱您的排序方案。尝试在表中其他地方(名称列)中已经可用的 PK 排序中存储一些含义似乎是多余的,因此是个坏主意。

一个更好的解决方案是不用担心 ID 列的值,当您在应用程序中使用数据时,只需对名称列进行排序。

PS:对于非答案类型的回复感到抱歉。通常我会假设你有一个很好的理由,只是给出一个直接解决你正在尝试做的事情的答案,但我从你的其他问题中注意到你仍处于数据库设计的早期学习阶段,所以我想提供帮助为您指明正确的方向,而不是帮助您进一步朝着不明智的方法前进。

于 2009-12-05T00:42:27.967 回答
7

您可以从旧表中选择一个新表,根据需要将您的选择排序。在新表中有一个自增 ID。如果需要,删除旧表并重命名新表。

于 2009-12-05T00:40:25.230 回答
2

为什么不在查询末尾添加“ORDER BY name ASC”?我的猜测是您出于某种原因需要该 ID。

于 2009-12-05T00:38:17.247 回答
-1
 SELECT
       RANK() Over (ORDER BY Name) As NewID
     , Name
     , Color

 FROM Fruits

可以保存到临时表然后截断然后截断水果表并插入,但这可能是一个糟糕的解决方案。

于 2009-12-05T00:42:43.707 回答