2

在我当前的应用程序中,我正在制作一个菜单结构,可以递归地创建子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是按“排序”列排序,但是在这种情况下,尽管这样做似乎并非不可能,只是有点困难。

我想要做的是使用 ID 列。因此,如果我将 id 10 更新为 id 1,那么之前存在的 id 1 将变为 2。

根据朋友的建议,我在想的是使用级联。然而,做更多的研究似乎并没有像我想象的那样奏效。

所以我的问题是,是否有能力在 MySQL 中天真地做到这一点?如果是这样,我可以通过什么方式做到这一点?如果不是,你会建议什么来得出最终结果?

列:

id title alias icon parent

父母的 id 比他们的孩子低,以确保脚本创建数组以将孩子放入其中。该部分有效,但是如果我想使用排序列,我将必须创建一个编号系统,以确保子元素在结果中永远不会高于其父元素。可能,但是如果我更新一个父级,那么我也必须唯一地更新它的所有子级,从而产生更多我想要的 MySQL 查询。

我不是 MySQL 专家,所以这就是我提出这个问题的原因,我觉得可能有一个完美的解决方案,可以在应用程序速度方面允许最少的开销。

4

1 回答 1

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, ...);

另一种选择,如果您不想删除并重新插入,则将第 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因为 AUTO_INCREMENT 不会执行负数,因此您可以将所有要切换为负 ID 的 ID。仍然这很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;
于 2013-06-30T04:04:30.610 回答