适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft Fabric 中的 SQL 数据库
检查 SQL Server 中指定表的当前标识值,如有必要,则更改标识值。 还可以使用 DBCC CHECKIDENT 为标识列手动设置新的当前标识值。
本文及其IDENTITY语法在不同SQL 数据库引擎平台上有所不同。 Microsoft Fabric Data Warehouse时,请在版本下拉列表中选择Fabric Data Warehouse。
语法
Syntax for SQL Server, Azure SQL 数据库, Azure SQL 托管实例, SQL database in Fabric:
DBCC CHECKIDENT
(
table_name
[ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
)
[ WITH NO_INFOMSGS ]
Azure Synapse Analytics 的语法:
DBCC 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 命令 |
标识更正或所做的更正 |
|---|---|
DBCC CHECKIDENT (<table_name>, NORESEED) |
不重置当前标识值。
DBCC CHECKIDENT 将返回标识列的当前标识值和当前最大值。 如果两个值不相同,重置恒定值以避免数值序列出现错误或空隙。 |
DBCC CHECKIDENT (<table_name>)或 DBCC CHECKIDENT (<table_name>, RESEED) |
如果表当前的身份值小于身份列中存储的最大身份值, DBCC CHECKIDENT 则使用身份列的最大值来重置。 请参阅后面的“例外”一节。 |
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 身份列存在 OR UNIQUE 约束,后续插入操作时会生成错误消息 2627,因为生成的身份值与现有值冲突。- 如果 PRIMARY KEY 不存在 OR 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. 在需要时重置当前标识值
以下示例可重置数据库中指定表当前的身份值(如有需要)。
USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType');
GO
B. 报告当前标识值
以下示例报告数据库中指定表当前的身份值,如果身份值错误,则不会进行纠正。
USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', NORESEED);
GO
C. 强制将当前标识值设为新值
以下示例强制该列AddressType当前的恒等值AddressTypeID为10。 由于表已有行,插入的下一行使用11作为值。 该列加1的新当前单位值即为该列的递增值。
USE AdventureWorks2022;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
D. 重置空表上的标识值
以下示例假设表的身份是 ,(1, 1)并在删除表中所有记录后,将该列ErrorLog当前的身份值ErrorLogID强制为 1。 由于表中没有现有的行,下一行插入时使用1作为值。 新的当前恒等值,不加TRUNCATE后列定义的增量值,或在后加增量值。DELETE
USE 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
相关内容
重新种入表的身份值Fabric Data Warehouse。 插入显式值后使用 DBCC CHECKIDENT , SET IDENTITY_INSERT 以重新对齐身份范围,防止与未来自动生成的值冲突。
本文及其IDENTITY语法在不同SQL 数据库引擎平台上有所不同。
语法
DBCC CHECKIDENT ( 'table_name' [ , RESEED ] )
参数
table_name
用于重新种入身份值的表名称。 表必须包含身份列。 表名可以包含模式名称,如 'dbo.DimCustomer''[dbo].[DimCustomer]'或 。
RESEED
RESEED关键词是可选的,但DBCC CHECKIDENT总是执行重种操作。 无论选择是否包含或省略,结果都是一样的。
关键RESEED词指示数据库引擎扫描所有已使用和保留的身份范围,并设置下一个身份值,以避免与现有值冲突。 Fabric Data Warehouse中,RESEED执行范围感知扫描,覆盖所有分布式计算节点,确定正确的下一个值。
备注
- 在Fabric Data Warehouse中,唯一支持
DBCC CHECKIDENT该选项的论证是RESEED选项,而它总是执行该选项。 系统会根据现有数据自动确定正确的下一个身份值范围。 你不能指定自定义的重种值。 - 每次在使用
IDENTITY_INSERT后运行DBCC CHECKIDENT以插入显式值。 该操作确保未来自动生成的值不会与手动插入的值发生冲突。 - Fabric Data Warehouse中,不支持自定义
new_reseed_value。 尝试提供某个值时会返回以下错误:Specifying a custom seed in Fabric Data Warehouse is not supported. -
DBCC CHECKIDENT获得可以阻止DML和DDL同时操作的锁。 为了减少干扰,当其他进程没有活跃使用该表时,应单独运行该命令。
权限
你必须拥有这张桌子或获得 ALTER 使用许可。
示例
A. 插入哨兵值后重新种子
在将哨兵值填充维 SET IDENTITY_INSERT度表后,重新种入身份列,以防止未来自动生成的值与手动插入的值发生冲突。
-- Insert sentinel values
SET IDENTITY_INSERT dbo.DimCustomer ON;
INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName)
VALUES (-1, 'Unknown'),
(-2, 'Not Applicable');
SET IDENTITY_INSERT dbo.DimCustomer OFF;
-- Reseed to realign future identity values
DBCC CHECKIDENT('dbo.DimCustomer', RESEED);
B. 大批量迁徙后重新播种
迁移带有显式身份值的历史数据后,重新种种表,确保新行获得的值不会与迁移数据重叠。
-- After migrating data with IDENTITY_INSERT
DBCC CHECKIDENT('dbo.DimProduct', RESEED);
-- Future inserts receive auto-generated values beyond the migrated range
INSERT INTO dbo.DimProduct (ProductName, Category)
VALUES ('New Widget', 'Hardware');
C. 复制入后重新种子 IDENTITY_INSERT
加载数据COPY INTOIDENTITY_INSERT后,将 当 是 ON,重新种入身份列。
COPY INTO 选项覆盖了 的 IDENTITY_INSERT会话层级设置。
COPY INTO dbo.DimStore (StoreKey 1, StoreName 2, Region 3)
FROM 'https://storage.blob.core.windows.net/migration/dimstore.csv'
WITH (
FILE_TYPE = 'CSV',
IDENTITY_INSERT = 'ON'
);
-- Reseed after bulk load
DBCC CHECKIDENT('dbo.DimStore', RESEED);
D. 没有RESEED关键字的重新种子
RESEED关键词是可选的,但DBCC CHECKIDENT总是执行重种操作。 无论选择是否包含或省略,结果都是一样的。
-- Reseed without the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore');
-- Reseed with the RESEED keyword
DBCC CHECKIDENT('dbo.DimStore', RESEED);