自动增量索引 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 IGNORE
、REPLACE
、INSERT .. ON DUPLICATE KEY UPDATE
等。默认情况下,InnoDB(有一个设置可以更改此设置)将预先分配所需的行数。但是 ROLLBACK
、dup 密钥等不会 return 未使用的号码到池中(除了你提到的重启情况)。
如果审计员正在查看日志,要么需要注意删除,要么要求您更改代码以避免重复使用 id。如果实在需要可以模拟一个"sequence"
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 IGNORE
、REPLACE
、INSERT .. ON DUPLICATE KEY UPDATE
等。默认情况下,InnoDB(有一个设置可以更改此设置)将预先分配所需的行数。但是 ROLLBACK
、dup 密钥等不会 return 未使用的号码到池中(除了你提到的重启情况)。
如果审计员正在查看日志,要么需要注意删除,要么要求您更改代码以避免重复使用 id。如果实在需要可以模拟一个"sequence"