2009-12-05 59 views
5

我有一个表像下面,MYSQL:如何“重新安排”的表格

| 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?

+3

为什么你要id顺序匹配名称顺序? – 2009-12-05 00:43:23

回答

9

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

如果任何人修改任何名称值或插入新行,它会弄乱您的订购方案。尝试在表格中已经可用的PK的顺序中存储一些含义(名称栏)似乎是多余的,因此是一个糟糕的主意。

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

PS:抱歉,对于非答复型回复。通常我会认为你有一个很好的理由,只是给出一个直接解决你想要做的问题的答案,但是我从其他问题中注意到你仍然处于数据库设计的早期学习阶段,所以我想帮忙将您指向正确的方向,而不是帮助您以不明智的方式进一步取得进展。

+1

这是一个很好的观点。如果您需要一些与每个字符串的排序值相对应的唯一编号,您可以添加一个额外的列并根据需要进行更新。如果将ID用作另一个表中的外键,重新排序ID将会严重破坏事物。 – 2009-12-05 00:45:30

+0

我建议添加额外的列进行排序的唯一时间是排序不能由表中的其他列确定。例如,如果应用程序允许用户任意重新排序项目。 – JohnFx 2009-12-05 00:48:46

+1

记录形成一个集合。这些集合不应该按照特定的顺序排列。回想一下,关系数据库理论是基于纯粹的数学概念。如果您希望在您的应用程序中使用特定的订单,请添加一个orderby子句,否则执行计划将决定如何检索数据,从而决定订单;这些计划可能随时间而改变。而且,回想一下代理键对最终用户没有意义。 – lmsasu 2009-12-05 14:05:09

2

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

7

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

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

FROM Fruits 

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

+0

MySQL不支持窗口功能。 – 2014-07-04 12:48:13

13

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

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; 
+0

这是错的。你不能选择所有的(SELECT * FROM table1),因为如果你这样做,你将复制PK以及与行信息相同的关联。这将使您得到具有相同名称和颜色的相同的确切表格链接到相同的ID,但具有不同的顺序。 – MJoraid 2014-04-18 04:19:59

+0

一个更正,你需要在从table1插入之前从表2中删除PK;那么不要选择*,但选择除ID以外的所有列。它会像魅力一样工作 – Zalaboza 2014-09-23 01:34:01