2013-06-30 169 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