0

我正在构建一个 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 开始。

是否可以在任何系统视图中找到下一个标识值?如果我可以将下一个值放入变量中,我可以使用它将下一个值设置为 0 或 1。我已经尝试过,IDENT_CURRENT('TableName')但它表示 1 表示 NULL 和 0 作为下一个值。

拜托,我不想要任何问题,比如“为什么你需要所有这些都从 1 开始”或任何其他暗示我所要求的结果之外的结果的问题。

4

3 回答 3

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

有关更多详细信息,请参阅此

于 2012-05-22T08:54:29.203 回答
0

首先禁用约束:

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column 

或者

ALTER TABLE foo NOCHECK CONSTRAINT ALL

然后在桌子上截断

于 2014-12-27T00:35:46.527 回答
0

澄清一下,您基本上是否希望所有未来的插入都从 开始1

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

于 2012-05-22T08:54:56.943 回答