自动递增mysql中的主键

nzk0hqpo  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(351)

在phpmyadmin上使用mysql创建表的过程中,当涉及到主键及其自动增量时,我总是会发现一个问题。当我在表中插入行时。自动递增可以完美地为每行上的每个主键添加1的值。但是当我删除一行例如主键为'id=4'的行时,我会向表中添加一个新行。新行中的主键获取值“id=5”而不是“id=4”。就好像老台词从未被删除。
下面是sql语句的示例:

CREATE TABLE employe(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL
)

ENGINE = INNODB;

我如何找到解决这个问题的办法?
谢谢您。

5gfr0r5j

5gfr0r5j1#

我很确定这是故意的。如果表中的id最多为6,并且删除了id 2,是否希望下一个输入的id为2?这似乎不符合酸的性质。此外,如果存在对该数据的依赖,例如,如果它是用户数据,并且id确定用户id,那么它将使先前存在的信息无效,因为如果删除用户x并且将相同id分配给用户y,则可能导致依赖系统中的完整性问题。
另外,假设一个表有500亿行。每次尝试插入新记录时,表是否应该运行o(n)搜索以查找丢失的最小id?我能看出这很快就失控了。
您可能喜欢阅读以下链接:
面向事务的数据库恢复原理(1983)
如何重用任何mysql db表中删除的id?

bgtovc5b

bgtovc5b2#

你为什么在乎?
主键是内部行标识符,不应该是性感或好看的。只要它们能够唯一地识别每一行,就可以达到它们的目的。
现在,如果您关心它的值,那么您可能希望在某个地方公开主键值,这是一个很大的危险信号。如果需要外部的可见标识符,可以使用所需的任何格式序列和值创建第二列。
作为旁注 AUTO_INCREMENT 有点误导。这并不意味着它们一直在一个接一个地增加。它只是意味着它将尽可能地产生序列号。在多线程应用程序中,这通常是不可能的,因为每个线程都保留了批处理或编号,因此行插入顺序可能会以不遵循自然编号的方式结束。行删除也有类似的效果 INSERT 有回退。

wkftcu5l

wkftcu5l3#

主键是用来将表连接在一起和索引的,它们不是用来供人使用的。重新排序主键列可能会孤立数据并破坏查询。
提示:向表中添加另一列,并根据需要对该列重新排序(向用户显示该列而不是主键)。

相关问题