将任何标识列重置为以1开头作为下一个值

时间:2012-05-22 08:49:54

标签: tsql sql-server-2008-r2 identity

我正在构建一个SQL脚本来重置数据库。为此,我想清空几个(不是全部)表并将其标识值重置为0.

对于某些表,我使用TRUNCATE TABLE,但是当外键约束引用表时,这不起作用。对于那些表,我使用DBCC CHECKIDENT(TableName, RESEED, 0)。这适用于大多数表,但并非适用于所有表。如果表从未有任何数据,则当前标识值为NULL而不是0:

CREATE TABLE TableName (Id int identity, Value varchar(10))
DBCC CHECKIDENT(TableName)

-- Checking identity information: current identity value 'NULL', current column value 'NULL'.

如果我对它们使用DBCC CHECKIDENT(TableName, RESEED, 0),则它们将具有0作为下一个标识值。我可以改为使用1作为重新设定的值,但是其中包含数据的表将从2开始。

是否可以在任何sys-views中找到下一个标识值?如果我可以将下一个值转换为变量,我可以使用它将下一个值设置为0或1.我已尝试使用IDENT_CURRENT('TableName'),但是对于NULL和0都表示为1,作为下一个值。

并且,我不想要任何问题,例如“为什么你需要所有这些从1开始”或任何其他问题表明我得到的结果不是另一个问题。

3 个答案:

答案 0 :(得分:5)

如果所有表都有标识字段,请使用。

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)'

MSforeachtable是一个未记录但非常方便的存储过程,它对数据库中的所有表执行给定的命令。

要仅使用标识列重新设置表,可以使用下一个脚本。 它还使用了sp_MSforeachtable,但考虑了正确的表格。

EXEC sp_MSforeachtable '
IF (SELECT COUNT(1) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = ''BASE TABLE'' 
    AND ''[''+ TABLE_SCHEMA + ''].['' + TABLE_NAME + '']'' = ''?'' 
    AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), ''TableHasIdentity'') = 1) > 0 
BEGIN
    DBCC CHECKIDENT (''?'', RESEED, 1)
END'

使用以下查询获取在数据库的表中插入的Last Identity值。

   SELECT TableName = OBJECT_NAME(OBJECT_ID) ,
       ColumnName = name ,
       OriginalSeed = seed_value ,
       Step = increment_value ,
       LastValue = last_value ,
       IsNotForReplication = is_not_for_replication
FROM sys.identity_columns

Refer this for more details

答案 1 :(得分:0)

为了澄清,您基本上希望将来的所有插入都从1开始吗?

我不是这个特定主题的MS-SQL专家,但你可以截断表,然后按照你的建议重置身份,然后如果身份是NULL,插入一条记录(应该得到{{ 1}})然后删除它?这不会留下创建的下一条记录0吗?

答案 2 :(得分:0)

首先禁用约束:

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column 

ALTER TABLE foo NOCHECK CONSTRAINT ALL

然后在表格上做截断