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