我有一张如下表格,
| 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执行此操作?
答案 0 :(得分:12)
重置自动增量的最简洁方法是创建另一个表。
MySQL提供有用的命令,例如CREATE TABLE LIKE
和RENAME 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
可以保存到临时表然后截断然后截断水果表并插入,但它可能是一个糟糕的解决方案。