Php MySQL更新、插入和删除时的更新ID

Php MySQL更新、插入和删除时的更新ID,php,mysql,mysqli,Php,Mysql,Mysqli,在我当前的应用程序中,我正在创建一个菜单结构,它可以递归地创建子菜单。然而,由于这一点,我发现很难同时允许某种重新排序的方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这样做似乎不是不可能的,只是有点困难 我要做的是使用ID列。所以,如果我将ID10更新为ID1,那么以前的ID1将变为2 在一位朋友的建议下,我的想法是使用cascades。然而,多做一点研究似乎并不像我想的那样有效 所以我的问题是,MySQL是否有能力天真地做到这一点?如果是这样的话,我该怎么做?如果没

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

我要做的是使用ID列。所以,如果我将ID10更新为ID1,那么以前的ID1将变为2

在一位朋友的建议下,我的想法是使用cascades。然而,多做一点研究似乎并不像我想的那样有效

所以我的问题是,MySQL是否有能力天真地做到这一点?如果是这样的话,我该怎么做?如果没有,你会建议最终结果是什么

列:

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


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

在ID列上这样做会很困难,因为您永远不能有两行具有相同的ID,所以在将行1设置为行2之前,您不能将行10设置为行1,但在设置行1之前,您不能将行1设置为行2第2行到第3行,等等。您必须删除第10行,然后更新ID+=1,其中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列上执行此操作将非常困难,因为您不能有两行具有相同的ID,因此在将行1设置为行2之前,您不能将行10设置为行1,但在将行2设置为行3之前,您不能将行1设置为行2,等等。您必须删除行10,然后更新ID+=1,其中ID<10。。。但是你也必须告诉MySQL从最高的数字开始,然后往下看……从技术上来说这是可能的,但你不应该这样做。您的ID列是应用程序中其他所有内容所挂起的,当您开始随意更改这些内容时,您将遇到大量其他问题。添加一个订单列,并执行您描述的所有操作。这是我希望避免的一件事,如果你能更新一个id,所有的id都会更新以适应,这似乎会很有用。虽然这是一个非常清晰易懂的答案,但如果没有其他想法,我会将其标记为答案。@我添加了另一个仅使用更新的选项。您可能会为它创建一个存储过程。
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, ...);
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;