Sql server 如何在使用identity_insert后自动重新设定种子?

Sql server 如何在使用identity_insert后自动重新设定种子?,sql-server,identity,identity-insert,Sql Server,Identity,Identity Insert,我最近从PostgreSQL数据库迁移到SQL Server数据库。要切换数据,我必须启用IDENTITY_INSERT。我们会发现,在任何一个表中进行插入时,由于重复的标识值(设置为主键),我会出现各种奇怪的错误 我有好几张桌子。自动重新设定每个表的标识,使其位于max(RID)之后的最简单方法是什么?将该信息与SQL函数结合使用,该函数从需要重置的每个表中获取max(RID)。例如,如果您想在25000处启动主键种子,请使用下面的代码(StartSeedValue-1) 所以在组合中,你应该

我最近从PostgreSQL数据库迁移到SQL Server数据库。要切换数据,我必须启用IDENTITY_INSERT。我们会发现,在任何一个表中进行插入时,由于重复的标识值(设置为主键),我会出现各种奇怪的错误

我有好几张桌子。自动重新设定每个表的标识,使其位于
max(RID)
之后的最简单方法是什么?

将该信息与SQL函数结合使用,该函数从需要重置的每个表中获取max(RID)。例如,如果您想在25000处启动主键种子,请使用下面的代码(StartSeedValue-1)

所以在组合中,你应该以这样的想法结束

DECLARE @maxVal INT
SELECT @maxVal = ISNULL(max(ID),0)+1 from mytable
DBCC CHECKIDENT('mytable', RESEED, @maxVal)
很抱歉使用了伪代码,因为我已经编写了一个SQL函数:)

编辑:

感谢您的帮助,将整数改为INT

USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO 

这将为您提供数据库中所有用户表的列表。使用此查询作为“循环”,这将允许重置所有表上的种子。

Tommy的答案是正确的,但如果我阅读正确,则可以简化为:

DBCC CHECKIDENT ('myTable')
根据文件:

如果表的当前标识值小于最大值 标识值存储在标识列中,使用 标识列中的最大值

这使您无需手动查找最大ID,并且从SQLServer2005开始就支持此功能

这应该在最初的OP案例中起作用。不过,文档中提到了两种情况,这两种情况都不起作用,您必须回到Tommy的解决方案,手动查找最大ID值:

  • 当前标识值大于中的最大值 桌子
  • 将从表中删除所有行
    • 也许最简单的方法(听起来很疯狂,代码看起来也很臭)就是像这样运行
      DBCC CHECKIDENT
      两次:

      -- sets all the seeds to 1
      exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED, 1)'
      
      -- run it again to get MSSQL to figure out the MAX/NEXT seed automatically
      exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'
      
      完成了

      如果需要,可以再次运行它以查看所有种子的设置:

      -- run it again to display what the seeds are now set to
      exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')'
      
      这只是一种创造性的方法,可以利用文档中的注释:

      如果表的当前标识值小于最大值 标识值存储在标识列中,使用 标识列中的最大值

      回滚案例-

      我已经在我的数据库中进行了测试,只有在我使用前面列出的代码时才有效(对+1进行了修改-我们不需要这个)

      注意,如果你把+1放在'ISNULL'部分之后,下一个标识列将跳转+1,例如-当前列10,在代码之后,下一个将是11,如果你在ISNULL之后使用+1,将是+12

      以及,守则:

      DBCC CHECKIDENT (teste_sequencial)
      
      Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'')'
      

      对我来说根本不起作用。如果您打开一个事务并执行回滚,则重新设定的种子将从事务中使用的最后一个数字开始。

      是否有办法自动为每个表执行此操作?+1,但整数不是sql server数据类型,因此请使用:
      DECLARE@maxVal INT
      并使用:
      SELECT@maxVal=ISNULL(max(ID),0)填充变量+mytable中的1
      @KM关于ISNULL检查的注意事项很好,但是SQL Server 2008识别出了
      整数
      ,在SQL Server 2008之前的版本中不支持整数,它是INT,并且问题没有指定2008。如果要从1
      DBCC CHECKIDENT('tablename',重新设定)开始ID,请从mytable中选择@maxVal=ISNULL(max(ID),0)
      甚至更自动地发送到所有表:
      Exec sp_MSforeachtable'DBCC CHECKIDENT(''?'')
      DECLARE @maxVal INT
      SELECT @maxVal = ISNULL(max(codsequencia),0) from teste_sequencial
      DBCC CHECKIDENT(teste_sequencial, RESEED, @maxVal)
      
      DBCC CHECKIDENT (teste_sequencial)
      
      Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'')'