从MySQL表中删除后重新排序键

从MySQL表中删除后重新排序键,mysql,Mysql,我正在从事一个项目,其中应用程序具有一组有序的字段。此外,还可以删除其中一个字段,但是,如果删除一行,它不会根据删除的内容重新排序,例如1、2、4、5、6 是否有一种方法可以根据上述字段对列表进行重新排序,以提供1、2、3、4、5?如果您知道删除了“3”,请执行以下操作: update t set id = id - 1 where id > 3 如果您知道您删除了“3”,请执行以下操作: update t set id = id - 1 where id

我正在从事一个项目,其中应用程序具有一组有序的字段。此外,还可以删除其中一个字段,但是,如果删除一行,它不会根据删除的内容重新排序,例如
1、2、4、5、6

是否有一种方法可以根据上述字段对列表进行重新排序,以提供
1、2、3、4、5

如果您知道删除了“3”,请执行以下操作:

update t
    set id = id - 1
    where id > 3
如果您知道您删除了“3”,请执行以下操作:

update t
    set id = id - 1
    where id > 3

这假设
id
列使用自动增量

我认为没有一种可靠的“单一命令方式”可以做到这一点。您可以使用Gordon的解决方案,但正如我提到的,它不会正确地重新组织您的ID

下面是我的解决方案(假设您可以使用PHP或其他脚本语言):

  • 检索所有表格数据
  • 截断你的桌子
  • 使用
    ALTER TABLE'your_TABLE'AUTO_INCREMENT=0
    重置自动增量
  • 重新插入以前检索到的数据

  • 这是我的方法。

    这假设
    id
    列使用自动增量

    我认为没有一种可靠的“单一命令方式”可以做到这一点。您可以使用Gordon的解决方案,但正如我提到的,它不会正确地重新组织您的ID

    下面是我的解决方案(假设您可以使用PHP或其他脚本语言):

  • 检索所有表格数据
  • 截断你的桌子
  • 使用
    ALTER TABLE'your_TABLE'AUTO_INCREMENT=0
    重置自动增量
  • 重新插入以前检索到的数据


  • 这是我的方法。

    你为什么要这样做?绝对没有理由这样做。主键是“只是一个值”,它没有任何意义,因此间隙或顺序并不重要。如果这对您很重要,那么列不应该是PKI,它不是主键或自动递增的,它是一个有序字段,我会在其中查找生成的报告。它根据字段的顺序导出字段。为什么要这样做?绝对没有理由这样做。主键是“只是一个值”,它没有任何意义,因此间隙或顺序并不重要。如果这对您很重要,那么列不应该是PKI,它不是主键或自动递增的,它是一个有序字段,我会在其中查找生成的报告。它根据它们的顺序导出字段。而BTW,当他在这个表中插入新行时,<代码> AutoPosial不会考虑它。在这种情况下,下一个新条目的id是7,而不是6.+1@tsabz,我很想知道这一点。。当我们向MYSQL发送删除请求(用于批量删除)时,它是在引擎中执行顺序删除还是同时执行批量删除?@tsabz。除非我遗漏了什么,否则问题不会指定这是一个自动递增列,只提到删除一行。然而,你提出了很好的观点。虽然我认为更重要的一点是不要重新分配自动递增ID。@GordonLinoff你是对的。使用id列的自动增量是一种习惯:)无论如何,您的答案在没有此选项的情况下也可以使用。我也做了一个回答,以防他需要AutoYLoad处理。@ GordonLinoff,添加一个ORDERBY子句是否更安全?和BTW,当他在这个表中插入新行时,<代码> AutoYouPux不会考虑它。在这种情况下,下一个新条目的id是7,而不是6.+1@tsabz,我很想知道这一点。。当我们向MYSQL发送删除请求(用于批量删除)时,它是在引擎中执行顺序删除还是同时执行批量删除?@tsabz。除非我遗漏了什么,否则问题不会指定这是一个自动递增列,只提到删除一行。然而,你提出了很好的观点。虽然我认为更重要的一点是不要重新分配自动递增ID。@GordonLinoff你是对的。使用id列的自动增量是一种习惯:)无论如何,您的答案在没有此选项的情况下也可以使用。我也做了回答,以防他需要自动递增处理。@GordonLinoff添加order by子句不是更安全吗?如果ID是唯一主键和自动递增,这会起作用,但是多个报表字段保存在同一个表中。如果ID是唯一主键和自动递增,这会起作用,但是,多个报表字段保存在同一个表中。