复制后将标识值重置为 1
Reset Identity Value To 1 After Replication
我使用 SQL 服务器并创建了一个复制。复制效果很好。但是我已经创建了一个备份用户的数据库来检查值。我用 "IDENT_CURRENT" 检查 tables,我看到标识列的值为 1。这正常吗?我无法向 table 插入新内容,因为它会引发 "Violation of PRIMARY KEY" 错误。
我该如何解决这个问题?
您可以使用 DBCC CHECKIDENT 重新设定身份值。因此发现 table 和 运行 中标识列的最大值,如:
例如
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
我已经编写了自己的解决方案。
此代码将所有 table 的身份值重置为最大值。
我在数据库复制后使用它。
DECLARE @TableName AS NVARCHAR(MAX)
DECLARE @ColName AS NVARCHAR(MAX)
DECLARE emp_cursor CURSOR FOR
select COLUMN_NAME, TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
order by TABLE_NAME
OPEN emp_cursor
FETCH NEXT FROM emp_cursor
INTO @ColName,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT @ColName
--PRINT @TableName
DECLARE @MaxId AS INT
--PRINT @TableName
EXEC ('DECLARE @MaxId AS INT;
DECLARE @TableName AS NVARCHAR(MAX)='''+@TableName+''';
SELECT @MaxId=ISNULL(MAX(' + @ColName + '),0)+1 FROM '+@TableName+';'+
'DBCC CHECKIDENT ('+@TableName+', RESEED,@MaxId);'+
'PRINT ''Table: ''+ @TableName +'', New Identity Val:''+CAST(@MaxId AS NVARCHAR);PRINT CHAR(13);'
)
从 emp_cursor
中获取下一个
INTO @ColName,@TableName
END
CLOSE emp_cursor;
DEALLOCATE emp_cursor;
我使用 SQL 服务器并创建了一个复制。复制效果很好。但是我已经创建了一个备份用户的数据库来检查值。我用 "IDENT_CURRENT" 检查 tables,我看到标识列的值为 1。这正常吗?我无法向 table 插入新内容,因为它会引发 "Violation of PRIMARY KEY" 错误。 我该如何解决这个问题?
您可以使用 DBCC CHECKIDENT 重新设定身份值。因此发现 table 和 运行 中标识列的最大值,如:
例如
USE AdventureWorks2012;
GO
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10);
GO
我已经编写了自己的解决方案。 此代码将所有 table 的身份值重置为最大值。 我在数据库复制后使用它。
DECLARE @TableName AS NVARCHAR(MAX)
DECLARE @ColName AS NVARCHAR(MAX)
DECLARE emp_cursor CURSOR FOR
select COLUMN_NAME, TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
order by TABLE_NAME
OPEN emp_cursor
FETCH NEXT FROM emp_cursor
INTO @ColName,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT @ColName
--PRINT @TableName
DECLARE @MaxId AS INT
--PRINT @TableName
EXEC ('DECLARE @MaxId AS INT;
DECLARE @TableName AS NVARCHAR(MAX)='''+@TableName+''';
SELECT @MaxId=ISNULL(MAX(' + @ColName + '),0)+1 FROM '+@TableName+';'+
'DBCC CHECKIDENT ('+@TableName+', RESEED,@MaxId);'+
'PRINT ''Table: ''+ @TableName +'', New Identity Val:''+CAST(@MaxId AS NVARCHAR);PRINT CHAR(13);'
)
从 emp_cursor
中获取下一个
INTO @ColName,@TableName
END
CLOSE emp_cursor;
DEALLOCATE emp_cursor;