Mysql 自动删除主键序列中的间隙

Mysql 自动删除主键序列中的间隙,mysql,sql,database,primary-key,Mysql,Sql,Database,Primary Key,我正在创建一个网页。此网页根据用户的操作将数据存储到MySQL数据库中。数据库有许多行。行的主键是列rowID,它只是按顺序对行进行编号(例如1、2、3、4…)。用户可以选择删除行。问题是,当用户删除最后一行以外的行时。rowID中有一个跳过。例如,如果有5行,1、2、3、4、5,用户将删除第三行。现在rowID列中的数据是1、2、4、5。我想知道MySQL或PHP中是否已经有一个内置函数来有效地解释这一点 我所知道的消除这种情况的唯一方法是遍历行并刷新rowID。然而,我觉得如果有大量的行,这

我正在创建一个网页。此网页根据用户的操作将数据存储到MySQL数据库中。数据库有许多行。行的主键是列rowID,它只是按顺序对行进行编号(例如1、2、3、4…)。用户可以选择删除行。问题是,当用户删除最后一行以外的行时。rowID中有一个跳过。例如,如果有5行,1、2、3、4、5,用户将删除第三行。现在rowID列中的数据是1、2、4、5。我想知道MySQL或PHP中是否已经有一个内置函数来有效地解释这一点

我所知道的消除这种情况的唯一方法是遍历行并刷新rowID。然而,我觉得如果有大量的行,这将是非常昂贵的时间


我还想知道如果正在创建新行,如何自动增加rowID。目前,我有代码查找当前最大行数并插入当前最大行数+1的行。

您不想这样做。主键是唯一的标识符,创建后不应更改。你要找的是。添加一个字段以跟踪左\u id和右\u id,并在必要时手动更新。Doctrine2中有一些库可以为您处理这个问题


如果您确实必须进行此更改,您可以使用alter table删除该字段,然后重新添加它。

不,因为它不重要。您不应该依赖于主键是连续序列。它唯一的功能是确保键是行的唯一标识符,除此之外,数字没有任何意义。

因此据我所知,解决方案是创建另一个与主键相同的列(但不是主键)并更新它?你也可以详细说明一下左id和右id的解决方案,因为我不确定我是否理解。这是PK永远不应该改变的一个观点。但是SQL特别支持针对这个“问题”的级联,并且可以更改的PK没有本质上的错误-当然,仅仅为了维护OP描述的无间隙序列而更改PK很可能存在问题。从您的示例中,如果删除了第3项。第一行left_id=0,right_id=2,第二行left_id=1,right_id=4,第四行left_id=2,right_id=5,第五行left_id=4,right_id=null谢谢,我真的很感激。为了更方便地管理此类数据,检查:+1我会写同样的答案-也许更详细-但最终它只会说这个。如果需要一个无间隙的序列,通常可以在select上作为一个视图操作来完成(或模拟这样的操作)——否则数据库本身并不关心。