数据库中已删除记录的数字主键是否会被重用于未来的新记录?

时间:2008-10-31 13:47:48

标签: mysql sql-server database primary-key rdbms

例如,如果我有一个自动编号字段,我会添加新记录而不指定此字段,让数据库引擎为我选择它。
那么,它会选择已删除记录的数量吗?如果是,何时?

// SQL Server,MySQL。 //

后续问题:What happens when DB engine runs out of numbers to use for primary keys?

11 个答案:

答案 0 :(得分:14)

NO。数字主键不会被重复使用,除非你手动指定它们(你应该真的避免这种情况!)

答案 1 :(得分:8)

AFAIK,这个可以在MySQL中发生:

How AUTO_INCREMENT Handling Works in InnoDB

  

只要服务器运行,InnoDB就会使用内存中的自动增量计数器。当服务器停止并重新启动时,InnoDB会重新初始化每个表的计数器,以便第一次INSERT到表中,如前所述。

After a restart of server. Innodb reuse previously generated auto_increment values.

  

建议修复:   innodb表不应该丢失auto_increment列之后的下一个数字的轨道   重新启动。

答案 2 :(得分:2)

取决于自动编号系统。如果你正在使用任何类型的序列,删除的记录的数量将不会被重用,因为序列不知道它们。

答案 3 :(得分:2)

通常,不,数字不会被重复使用。

但是,您可以 - 在像Oracle这样的产品中 - 指定一个循环的序列生成器,并将重用数字。

这些是否是已删除记录的数量是您的应用程序的问题。

答案 4 :(得分:1)

不具体。如果正在从序列或自动递增标识列中读取密钥,则序列将仅插入并生成下一个值。但是,您可以取消激活(SQL Server上的set identity_insert on)并在列中放入您想要的任何数字,只要它不违反唯一性约束。

答案 5 :(得分:1)

这个问题需要更精确:

...“使用Oracle Sequences”

...“使用MySQL自动编号列”

...等......

答案 6 :(得分:1)

只要您正确创建表格,就不会重复使用数字。 但是,您可以使用以下命令重置标识列(无论如何都是IN MSSQL):

- 输入表格中最后一个有效条目的编号,而不是下一个要使用的编号

DBCC CHECKIDENT([TableName],RESEED,[NumberYouWantToStartAt])

这当然是疯了......永远不应该这样做:)

答案 7 :(得分:1)

MySQL不会重用ID,除非你truncate表或delete from没有where子句的表(在这种情况下,MySQL,内部只是truncate

答案 8 :(得分:0)

是的,这实际上取决于你生成id的方式。

例如,如果您使用GUID作为主键,大多数获取随机新Guid的实现都不太可能再次选择另一个guid,但是它会给予足够的时间,如果Guid不在表中,则插入声明会很好,但是如果已经有一个guid,你将会遇到主键约束违规。

答案 9 :(得分:0)

我认为重用id是一个bug的MySQL“功能”。

考虑处理文件上传等问题。使用数据库ID作为文件名是一种很好的做法:简单,没有使用用户提供的文件名的漏洞风险等。

当涉及到文件系统时,你无法真正使所有事务处理...你必须提交数据库事务然后编写文件,或者编写文件并提交数据库事务,但如果一个或两个都失败,或者你遇到了崩溃,或者你的网络文件系统有问题,你可能在数据库中没有有效的记录,没有文件,或者没有数据库记录的文件,因为事情不是原子的。

如果出现这样的问题,并且服务器在返回时做的第一件事就是覆盖回滚事务的ID,以及文件,这很糟糕。这些文件可能很有用。

答案 10 :(得分:0)

不,想象一下,如果您的银行决定重新使用您的account_id - arghhhh !!