SQL Server DBCC CHECKIDENT更改当前标识值
检查 SQL Server 中指定表的当前标识值如有必要则更改标识值。 还可以使用DBCC CHECKIDENT为标识列手动设置新的当前标识值。Transact-SQL 语法约定语法SQL Server 和 Azure SQL 数据库的语法syntaxsqlDBCC CHECKIDENT ( table_name [ , { NORESEED | { RESEED [ , new_reseed_value ] } } ] ) [ WITH NO_INFOMSGS ]Azure Synapse Analytics 的语法syntaxsqlDBCC CHECKIDENT ( table_name [ RESEED , new_reseed_value ] ) [ WITH NO_INFOMSGS ]参数table_name要对其当前标识值进行检查的表名。 指定的表必须包含标识列。 表名必须遵循有关标识符的规则。 两个或三个部分的名称必须进行分隔例如Person.AddressType或[Person].[AddressType]。NORESEED指定不应更改当前标识值。RESEED指定应该更改当前标识值。new_reseed_value用作标识列的当前值的新值。使用 NO_INFOMSGS取消显示所有信息性消息。备注对当前标识值所做的具体更正取决于参数规范。DBCC CHECKIDENT 命令标识更正或所做的更正DBCC CHECKIDENT (table_name, NORESEED)不重置当前标识值。DBCC CHECKIDENT将返回标识列的当前标识值和当前最大值。 如果这两个值不相同则应重置标识值以避免值序列中的潜在错误或空白。DBCC CHECKIDENT (table_name)或DBCC CHECKIDENT (table_name, RESEED)如果表的当前标识值小于标识列中存储的最大标识值则使用标识列中的最大值对其进行重置。 请参阅后面的“例外”一节。DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)将当前标识值设置为new_reseed_value。 如果自从创建表以来未在表中插入任何行或者已使用 TRUNCATE TABLE 语句删除所有行则在运行 DBCC CHECKIDENT 之后插入的第一行将使用new_reseed_value作为标识。 如果行位于表中或如果已通过使用 DELETE 语句删除了所有行则下一个插入行将使用new_reseed_value 当前增量值。 如果事务插入一个行并且稍后回滚则下一个插入行使用new_reseed_value 当前增量值就像已删除该行一样。 如果该表不为空那么将标识值设置为小于标识列中的最大值的数字时将会出现下列情况之一- 如果标识列中存在 PRIMARY KEY 或 UNIQUE 约束则随后在表中执行插入操作时将生成错误消息 2627原因是生成的标识值将与现有值冲突。- 如果不存在 PRIMARY KEY 或 UNIQUE 约束则随后的插入操作将产生重复的标识值。例外下表列出了DBCC CHECKIDENT不自动重置当前标识值时的条件并提供了重置该值的方法。条件重置方法当前标识值大于表中的最大值。执行DBCC CHECKIDENT (table_name, NORESEED)以确定列中的当前最大值。 接下来在 命令中指定该值作为 new_reseed_value。或在将DBCC CHECKIDENT (table_name, RESEED,new_reseed_value)设置为非常低的值的情况下执行new_reseed_value然后运行DBCC CHECKIDENT (table_name, RESEED)以更正该值。删除表中的所有行。在将DBCC CHECKIDENT (table_name, RESEED, new_reseed_value)设置为新的起始值的情况下执行new_reseed_value。更改种子值种子值是针对加载到表中的第一行插入到标识列的值。 所有后续行都包含当前标识值和增量值其中当前标识值是为当前表或视图生成的最新标识值。无法使用DBCC CHECKIDENT执行以下任务更改创建表或视图时为标识列指定的原始种子值。重设表或视图中的现有行的种子值。若要更改原始种子值并重设所有现有行的种子值请删除并重新创建标识列然后为标识列指定新的种子值。 当表包含数据时还会将标识号添加到具有指定种子值和增量值的现有行中。 无法保证行的更新顺序。结果集无论是否为包含标识列的表指定了任何选项DBCC CHECKIDENT都会为所有操作除了一个操作返回以下消息。 该操作指定新的种子值。正在检查标识信息: 当前标识值‘当前标识值’当前列值‘当前列值’。 DBCC 执行完毕。 如果 DBCC 输出了错误消息请与系统管理员联系。在DBCC CHECKIDENT用于通过使用RESEED new_reseed_value来指定新的种子值时将返回以下消息。正在检查标识信息: 当前标识值为‘当前标识值’。 DBCC 执行完毕。 如果 DBCC 输出了错误消息请与系统管理员联系。权限调用方必须拥有包含此表的架构或者是sysadmin固定服务器角色、db_owner固定数据库角色或db_ddladmin固定数据库角色的成员。Azure Synapse Analytics 需要 db_owner 权限。示例A. 在需要时重置当前标识值以下示例在需要时重置AdventureWorks2025数据库中指定表的当前标识值。SQLUSE AdventureWorks2022; GO DBCC CHECKIDENT (Person.AddressType); GOB. 报告当前标识值以下示例报告AdventureWorks2025数据库的指定表中的当前标识值但如果该标识值不正确不会进行更正。SQLUSE AdventureWorks2022; GO DBCC CHECKIDENT (Person.AddressType, NORESEED); GOC. 强制将当前标识值设为新值以下示例强制将AddressTypeID表中的AddressType列中的当前标识值设置为 10。 因为该表有现有行因此下一个插入行将使用 11 作为值。 为该列定义的新的当前标识值加上 1该列的增量值。SQLUSE AdventureWorks2022; GO DBCC CHECKIDENT (Person.AddressType, RESEED, 10); GOD. 重置空表上的标识值以下示例假设(1, 1)的表标识并在从表中删除所有记录后强制将ErrorLogID表中的ErrorLog列中的当前标识值设置为 1。 因为该表没有现有行因此下一个插入行将使用 1 作为值即新的当前标识值而不会在 TRUNCATE 后加上为该列定义的增量值也不会在 DELETE 后添加增量值。SQLUSE AdventureWorks2022; GO TRUNCATE TABLE dbo.ErrorLog GO DBCC CHECKIDENT (dbo.ErrorLog, RESEED, 1); GO DELETE FROM dbo.ErrorLog GO DBCC CHECKIDENT (dbo.ErrorLog, RESEED, 0); GO另请参阅ALTER TABLE Transact-SQLCREATE TABLE Transact-SQLDBCC Transact-SQLIDENTITY属性(Transact-SQL)复制标识列使用Transact-SQLIDENT_SEEDTransact-SQLIDENT_INCRTransact-SQL