例如,如果我有一个自动编号字段,我会添加新记录而不指定此字段,让数据库引擎为我选择它。
那么,它会选择已删除记录的数量吗?如果是,何时?
// SQL Server,MySQL。 //
后续问题:What happens when DB engine runs out of numbers to use for primary keys?
答案 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 !!