首页 > 解决方案 > 在 INSERT 查询中增加非主键字段

问题描述

我正在尝试将行从旧公司复制到新公司。

SET IDENTITY_INSERT [SomeDB].[dbo].[SomeTable] ON;

INSERT INTO [SomeDB].[dbo].[SomeTable] 
       ([HRCo]
      ,[Code]
      ,[Type]
      ,[Description]
      ,[SafetyYN]
      ,[Notes]
      ,[UniqueAttchID]
      ,[CertPeriod]   
      ,[KeyID]
      ,[PTOTypeYN]
      ,[PRLeaveCode]) 
SELECT '6',
       SomeTable.Code
      ,SomeTable.Type
      ,SomeTable.Description
      ,SomeTable.SafetyYN
      ,SomeTable.Notes
      ,SomeTable.UniqueAttchID
      ,SomeTable.CertPeriod    
      ,[KeyID]      
      ,SomeTable.PTOTypeYN
      ,SomeTable.PRLeaveCode
      FROM [SomeDB].[dbo].[SomeTable] 
WHERE HRCo = '11'

SET IDENTITY_INSERT [SomeDB].[dbo].[SomeTable] OFF;

我得到的结果是一个错误:

无法在具有唯一索引“biKeyID”的对象“dbo.SomeTable”中插入重复的键行。重复键值为 (1377)。

有没有办法为此列使用增量?(它不是主键列)或者可能有另一种方法来复制多条记录?

标签: sqlsql-serverincrement

解决方案


你在评论中说主键是 on([HRCo], [Code], [Type])并且IDENTITYis KeyID。这些信息应该在问题中。了解正在发生的事情很重要。

您正在为您的副本设置HRCoto 6,所以我假设这可以保证新的主键是唯一的。

至于KeyID,该IDENTITY列将在 期间自动获取其(新的,递增的)值INSERT,因此您不应在INSERT语句中包含该列。这就是这样IDENTITY做的。IDENTITY自动将新的顺序值分配给新行。你不应该SET IDENTITY_INSERT在这里。让我们IDENTITY做它该做的。

INSERT INTO [SomeDB].[dbo].[SomeTable] 
       ([HRCo]
      ,[Code]
      ,[Type]
      ,[Description]
      ,[SafetyYN]
      ,[Notes]
      ,[UniqueAttchID]
      ,[CertPeriod]   
      --,[KeyID]
      ,[PTOTypeYN]
      ,[PRLeaveCode]) 
SELECT '6',
       SomeTable.Code
      ,SomeTable.Type
      ,SomeTable.Description
      ,SomeTable.SafetyYN
      ,SomeTable.Notes
      ,SomeTable.UniqueAttchID
      ,SomeTable.CertPeriod    
      --,[KeyID]      
      ,SomeTable.PTOTypeYN
      ,SomeTable.PRLeaveCode
FROM [SomeDB].[dbo].[SomeTable] 
WHERE HRCo = '11'

请注意,我从and语句中删除了该KeyID列。INSERTSELECT


推荐阅读