2009-12-05 57 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