自动增量索引 SQL 服务器、Oracle DB 和 MySQL with InnoDB

Auto Increment Index SQL Server, Oracle DB and MySQL with InnoDB

MySQL with InnoDB engine 具有 "feature" 将自动增量列的索引保存在 RAM 上,并且每次服务启动时都会更新。当您删除 table 底部的行,重新启动 MySQL 服务然后插入新行时,这会导致可能出现重复的 id,其 id 将重复。例如:

1.- 我们有这个:

ID   | Name
-------------
1    |'John'
2    |'Paul'
3    |'Ringo'
4    |'George'

2.- 我们删除 id=4

的行
ID   | Name
-------------
1    |'John'
2    |'Paul'
3    |'Ringo'

我们重新启动MySQL并插入一个新行

ID   | Name
-------------
1    |'John'
2    |'Paul'
3    |'Ringo'
4    |'Pete'

所以,我的问题是:SQL Server 和 Oracle DB 有相似的行为或者它们的最终结果如下 table:

ID   | Name
-------------
1    |'John'
2    |'Paul'
3    |'Ringo'
5    |'Pete'

换句话说,SQL 服务器和 Oracle DB 的行为是否与 MySQL 与 InnoDB 的行为相同,或者即使在重置后它仍保留 auto_increment 列的 las 索引,所以没有可能重复的条目?

InnoDB 保证任何时刻的唯一性。它不保证不删除 + 重新启动 + 插入重复使用一个数字。如果您的应用期望如此,那么您的期望比它提供的要多。

在其他情况下,InnoDB 可能 表现不同。考虑多行 INSERT IGNOREREPLACEINSERT .. ON DUPLICATE KEY UPDATE 等。默认情况下,InnoDB(有一个设置可以更改此设置)将预先分配所需的行数。但是 ROLLBACK、dup 密钥等不会 return 未使用的号码到池中(除了你提到的重启情况)。

如果审计员正在查看日志,要么需要注意删除,要么要求您更改代码以避免重复使用 id。如果实在需要可以模拟一个"sequence"