MYSQL:如何“重新排序”表

时间:2009-12-05 00:35:59

标签: mysql alphabetical

我有一张如下表格,

| 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执行此操作?

5 个答案:

答案 0 :(得分:12)

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

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;

答案 1 :(得分:8)

我可以问你为什么要这样做吗?

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

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

PS:抱歉非答案类型的回复。通常情况下,我认为你有充分的理由,只是给出一个直接解决你想要做的事情的答案,但我从你的其他问题中注意到你仍处于数据库设计的早期学习阶段,所以我想帮助指出你正确的方向,而不是帮助你进一步走向一个不明智的方法。

答案 2 :(得分:7)

您可以SELECT INTO旧表格中的新表格,根据需要订购您的选择。在新表中有一个自动增量ID。如果需要,请删除旧表并重命名新表。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

 SELECT
       RANK() Over (ORDER BY Name) As NewID
     , Name
     , Color

 FROM Fruits

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