如何更改主键自动增量,以便在删除行时不会跳过值[重复]

Posted

技术标签:

【中文标题】如何更改主键自动增量,以便在删除行时不会跳过值[重复]【英文标题】:How do I alter the primary keys auto-increment so it dosen't skip values in case I delete a row [duplicate] 【发布时间】:2019-09-16 03:14:07 【问题描述】:

我正在为学校做这项作业,我希望我的主键 (id) 变为 1、2、3 等等。但如果我删除一行并添加一个新人,它会跳过那个数字。

这是我在 mysql 工作台上的查询

CREATE TABLE IF NOT EXISTS person
(
id              int(11)         NOT NULL auto_increment primary key,
first_name      varchar(45),
last_name       varchar(45)
);     

我不确定我必须在哪里查看以及要更改什么。

我的 addPerson 语句是这样的:

public Person addPerson(Person p)

String sql = "INSERT INTO person (first_name, last_name) VALUES(?,?) ";

template.update(sql, p.getFirst_name(), p.getLast_name());

return null;

我也不是问为什么不应该这样做,而是问是否可能

【问题讨论】:

你不能也不应该。 ID 的全部意义在于唯一。 即使没有删除(或插入重复键),也不能保证 auto_increment 会产生连续的 id 我正在寻找的是如果我有 id: 1,2,3 并且我删除了 2。然后它变为 1,3。我希望能够这样做,所以当我添加一个新人时,它会选择释放的密钥 一个人死后不会给另一个人身份证号码 【参考方案1】:

自动增量的全部意义在于您不必自己计算。当您查询数据库时,您应该使用另一列来执行此操作(如姓名、年龄或其他内容),然后从结果中您可以获得该行的 id。所以跟踪id真的没有意义

【讨论】:

【参考方案2】:

这不是你能做的。这也不是您真正想要在真实场景中做的事情。如果可以重用键,那么每次添加新记录以查找可用键时都必须进行全表扫描,这将对性能造成重大影响(您所看到的功能是通过简单地跟踪生成的最高键值来实现的) .更不用说在为更复杂的数据库禁用外键约束的情况下最终出现不一致数据的风险。

因此,这不是我所知道的任何数据库中内置的功能。有什么理由(除了美学)想要这样做吗?

【讨论】:

以上是关于如何更改主键自动增量,以便在删除行时不会跳过值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

重新排序/重置自动增量主键

“更改开”中有两个值的条形图,跳过值为 0 的条形图

将自动增量主键插入现有表

将自动增量主键插入现有表

将自动增量主键插入现有表

重新排序/重置自动增量主键