我正在构建一个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开始”或任何其他问题表明我得到的结果不是另一个问题。
答案 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
答案 1 :(得分:0)
为了澄清,您基本上希望将来的所有插入都从1
开始吗?
我不是这个特定主题的MS-SQL专家,但你可以截断表,然后按照你的建议重置身份,然后如果身份是NULL,插入一条记录(应该得到{{ 1}})然后删除它?这不会留下创建的下一条记录0
吗?
答案 2 :(得分:0)
首先禁用约束:
ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column
或
ALTER TABLE foo NOCHECK CONSTRAINT ALL
然后在表格上做截断