5

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

// SQL 服务器,MySQL。//

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

4

11 回答 11

15

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

于 2008-10-31T13:48:52.843 回答
8

AFAIK,这可能发生在 MySQL 中:

AUTO_INCREMENT 处理如何在 InnoDB 中工作

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

重启服务器后。Innodb 重用以前生成的 auto_increment 值。

建议修复:重新启动后,innodb 表不应丢失 auto_increment 列的下一个数字的跟踪。

于 2008-10-31T14:02:43.970 回答
2

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

于 2008-10-31T13:49:21.330 回答
2

一般来说,不,数字不会被重复使用。

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

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

于 2008-10-31T13:51:24.133 回答
1

不具体。如果键是从序列或自动递增标识列中读取的,则序列将插入并产生下一个值。但是,您可以停用此功能(set identity_insert on在 SQL Server 上)并在列中放置您想要的任何数字,只要它不违反唯一性约束即可。

于 2008-10-31T13:52:51.167 回答
1

这个问题需要更精确:

...“使用 Oracle 序列”

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

... ETC...

于 2008-10-31T13:53:16.330 回答
1

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

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

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

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

于 2008-10-31T13:54:47.903 回答
1

MySQL 不会重用 ID,除非您truncate使用表或delete from没有where子句的表(在这种情况下,MySQL 在内部只是简单地执行 a truncate)。

于 2008-10-31T13:59:19.003 回答
0

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

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

于 2008-10-31T20:18:04.307 回答
0

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

考虑像处理文件上传这样的事情。使用数据库 id 作为文件名是一个很好的做法:简单,没有用户提供的文件名等漏洞的风险。

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

如果发生这样的问题,并且服务器返回时做的第一件事就是覆盖 ids,从而覆盖回滚事务的文件,那就糟透了。这些文件可能很有用。

于 2009-10-30T16:17:39.437 回答
0

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

于 2010-09-10T12:25:16.450 回答