数据库中已删除记录的数字主键是否会被重用于未来的新记录?
-
05-07-2019 - |
题
例如,如果我有一个自动编号的字段,我添加新记录而不指定此字段,让数据库引擎为我选择它。
那么,它会选择已删除记录的数量吗?如果是,何时?
// SQL Server,MySQL。 //
解决方案
NO。数字主键不会被重复使用,除非你手动指定它们(你应该真的避免这种情况!)
其他提示
AFAIK,这个可以在MySQL中发生:
AUTO_INCREMENT处理如何在InnoDB中运行一个>:
只要服务器运行,InnoDB就会使用内存中的自动增量计数器。当服务器停止并重新启动时,InnoDB会重新初始化每个表的计数器,以便第一次INSERT到表中,如前所述。
重启服务器后。 Innodb重用以前生成的auto_increment值。 :
建议修复: innodb表不应该丢失auto_increment列之后的下一个数字的轨道 重新启动。
取决于自动编号系统。如果你正在使用任何类型的序列,删除的记录的数量将不会被重用,因为序列不知道它们。
通常,不,数字不会被重复使用。
但是,您可以 - 在像Oracle这样的产品中 - 指定一个循环的序列生成器,并将重用数字。
这些是否是已删除记录的数量是您的应用程序的问题。
这个问题需要更精确:
...“使用Oracle Sequences"
...“使用MySQL自动编号列”
...等......
只要您正确创建表格,就不会重复使用数字。 但是,您可以使用以下命令重置标识列(无论如何都是IN MSSQL):
- 输入表格中最后一个有效条目的编号,而不是下一个要使用的编号
DBCC CHECKIDENT([TableName],RESEED,[NumberYouWantToStartAt])
这当然是疯了......永远不应该这样做:)
除非你截断
表或从
删除表没有 where
子句(在这种情况下是MySQL,内部),否则MySQL不会重用ID ,只需执行 truncate
)。
不具体。如果正在从序列或自动递增标识列中读取密钥,则序列将仅插入并生成下一个值。但是,您可以取消激活(在SQL Server上 set identity_insert on
)并在列中放入您想要的任何数字,只要它不违反唯一性约束。
是的,这实际上取决于你生成id的方式。
例如,如果您使用GUID作为主键,大多数获取随机新Guid的实现都不太可能再次选择另一个guid,但是它会给予足够的时间,如果Guid不在表中,则插入声明会很好,但是如果已经有一个guid,你将会遇到主键约束违规。
我认为MySQL“功能”重用id是一个bug。
考虑处理文件上传等问题。使用数据库ID作为文件名是一种很好的做法:简单,没有使用用户提供的文件名的漏洞风险等。
当涉及到文件系统时,你无法真正使所有事务处理...你必须提交数据库事务然后编写文件,或者编写文件并提交数据库事务,但如果一个或两个都失败,或者你遇到了崩溃,或者你的网络文件系统有问题,你可能在数据库中没有有效的记录,没有文件,或者没有数据库记录的文件,因为事情不是原子的。
如果出现这样的问题,并且服务器在返回时做的第一件事就是覆盖回滚事务的ID,以及文件,这很糟糕。这些文件可能很有用。
不,想象一下,如果您的银行决定重新使用您的account_id - arghhhh !!