在我目前的应用程序中,我正在创建一个菜单结构,可以递归地创建子菜单。但是由于这个原因,我发现很难允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但在这种情况下,尽管这样做似乎不太可能,但稍微困难一些。
我想要做的是使用ID列。因此,如果我将id 10更新为id 1,则之前的id 1变为2。
我在朋友的建议中想到的是使用级联。然而,做一些似乎没有像我想的那样工作的研究。
所以我的问题是,是否有能力在MySQL中天真地做到这一点?如果是这样,我可以用这种方式做什么?如果没有,你会建议你得出最终结果?
列:
id title alias icon parent
父母的子ID低于他们的孩子,以确保脚本创建数组以将子项放入其中。那部分是有效的,但是如果我想使用一个排序列,我将不得不建立一个编号系统,以确保子元素永远不会高于结果中的父元素。可能,但如果我更新父级,那么我必须唯一更新其所有子级,从而产生更多我想要的MySQL查询。
我不是MySQL专家,所以这就是我提出这个问题的原因,我觉得可能有一个完美的解决方案,可以在应用程序的速度上实现最小的开销。
答案 0 :(得分:1)
在ID列上执行此操作会很困难,因为您不能拥有2个具有相同ID的行,因此在将第1行设置为第2行之前,您不能将第10行设置为第1行,但是您可以将第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, ...);
另一个选项,如果您不想删除并重新插入,则将第10行的id设置为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设置为负ID,因为AUTO_INCREMENT不会执行负数。这仍然是非常hacky,我不会推荐它。您可能还需要锁定表,以便在运行时不会发生其他写操作。:
将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;