我向一个SQL Server数据库表插入了记录。该表定义了一个主键,自动增量身份种子被设置为 "是"。这样做主要是因为在SQL Azure中,每个表都必须有一个主键和身份定义。
但由于我必须从表中删除一些记录,这些表的身份种子将被扰乱,索引列(自动生成的增量为1)将被扰乱。
**我如何在删除记录后重置身份列,使该列有升序的数字顺序?
身份列在数据库中不作为外键使用。
DBCC CHECKIDENT
]1 管理命令用于重置身份计数器。该命令的语法是
DBCC CHECKIDENT (table_name [, { NORESEED | { RESEED [, new_reseed_value ]}}])
[ WITH NO_INFOMSGS ]
举例说明。
DBCC CHECKIDENT ('[TestTable]', RESEED, 0);
GO
在以前的Azure SQL数据库版本中不支持,但现在已经支持了。
请注意,new_reseed_value
参数在不同的SQL Server版本中是不同的根据文档。
如果表中有行,下一行将以new_reseed_value值插入。在SQL Server 2008 R2和更早的版本中,插入的下一行使用new_reseed_value+当前增量值。
然而,我发现这一信息具有误导性(实际上是完全错误的),因为观察到的行为表明,至少SQL Server 2012仍然使用new_reseed_value+当前增量值的逻辑。微软甚至与它自己在同一页上的 "例子C "相抵触。
C. 强制将当前身份值变成一个新值
下面的例子强制当前身份值在 AddressType表中的AddressTypeID列的当前身份值为10。 因为该表有现有的行,下一个插入的行将使用11 作为值,也就是说,新的当前增量值定义为 列的值加1。
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
尽管如此,这都为新的SQL Server版本留下了不同行为的选项。我想,在微软在自己的文档中澄清之前,确定的唯一方法是在使用前做实际测试。