2013-06-30 176 views
2

在我目前的應用程序中,我正在製作一個菜單結構,可以遞歸地創建子菜單的自身。但是由於這個原因,我發現很難允許某種重新排序方法。大多數應用程序可能只是通過「排序」列來排序,但在這種情況下,儘管這樣做似乎不可能,但稍微難一點。更新,插入和刪除MySQL更新ID

我想要做的就是使用ID列。所以,如果我更新id 10爲id 1,那麼id 1之前會變成2.

我在想一個朋友的建議是使用級聯。不過,多做一點研究似乎並不像我想的那樣有效。

所以我的問題是,是否有能力在MySQL中天真地做到這一點?如果是的話,我可以做什麼?如果不是,你會建議如何達成最終結果?

列:

id title alias icon parent 

父母有一個較低的ID,然後在自己的孩子,以確保腳本創建陣列把孩子裏面。但是,如果我想使用排序列,那麼我將不得不建立一個編號系統,以確保子元素永遠不會高於結果中的父元素。可能的,但是如果我更新了父項,那麼我必須唯一地更新其所有子項,從而產生更多的MySQL查詢。

我不是MySQL專家,所以這就是爲什麼我提出這個問題,我覺得可能有一個完美的解決方案,這可以讓最小的開銷,當涉及到應用程序的速度。

+0

做它的ID列將是艱難的,因爲你永遠不能有相同的ID,所以你不能設置行10至2行第1行,直到將第1行設置爲第2行,但您不能將第1行設置爲第2行,直到將第2行設置爲第3行等。您必須刪除第10行,然後執行更新ID + = 1 WHERE ID <10 ...但你還必須告訴MySQL從最高的數字開始,然後往下...... – chrislondon

+1

技術上這是可能的,但你不應該這樣做。您的ID列是您應用程序中的其他所有內容,當您開始改變這一切時,您將遇到大量其他問題。添加一個訂單欄,並做你所描述的一切。它會爲你節省很多頭痛的道路。 – Orangepill

回答

1

在ID列上做它會很困難,因爲你永遠不會有2行具有相同的ID,所以你不能將第10行設置爲第1行,直到你將第1行設置爲第2行但你不能將第1行設置爲第2行,直到將第2行設置爲第3行等等。您必須刪除第10行,然後執行更新ID + = 1 WHERE ID < 10 ...但您也可以告訴MySQL來從最高號開始,往下走....

你不得不做,在單獨的查詢是這樣的:

移動ID 10 ID 2

DELETE FROM table WHERE id = 10; 

UPDATE table SET id = id + 1 WHERE id >= 2 AND id < 10 ORDER BY id DESC 

INSERT INTO table (id, ...) VALUES (2, ...); 

另一種選擇,如果你不想刪除並重新將設置id爲行10是MAX(ID)+ 1,然後將其設置爲1後

另外如果你想移動第2行至第10行,你不得不減去ID:

移動ID 2〜ID 10

DELETE FROM table WHERE id = 2; 

UPDATE table SET id = id - 1 WHERE id > 2 AND id <= 10 ORDER BY id DESC 

INSERT INTO table (id, ...) VALUES (10, ...); 

如果沒有你的ID列設置爲UNSIGNED你能湊合您想要切換到負號的所有ID因爲AUTO_INCREMENT不會做負數。儘管如此,我還是不推薦它。您也可能需要鎖定表,以便在運行時不會發生其他寫入。:

移動ID 2〜ID 10

UPDATE table SET id = id * -1 WHERE id > 2 AND id <= 10; 

UPDATE table SET id = 10 WHERE id = 2; 

UPDATE table SET id = id * -1 - 1 WHERE id < -2 AND id >= -10; 
+0

這是我希望避免的一件事情,如果您可以更新身份證並且所有身份證件都會更新以適合您的身份,它似乎可以派上用場。雖然這是一個非常明確和可以理解的答案,但如果沒有其他想法進來,我會將其標記爲答案。 –

+0

@REaction我添加了另一個只使用更新的選項。你可能可以爲它創建一個存儲過程。 – chrislondon