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

// SQL Server,MySQL。 //

后续问题:当数据库引擎用完主键以用于主键时会发生什么?

有帮助吗?

解决方案

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

其他提示

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

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

但是,您可以 - 在像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 !!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top