在INSERT查询中增加非主键字段

时间:2020-07-01 17:01:32

标签: sql sql-server increment

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

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)。

有没有一种方法可以为该列使用增量? (这不是主键列),或者还有另一种复制多条记录的方法吗?

2 个答案:

答案 0 :(得分:2)

您在评论中说,主键在([HRCo], [Code], [Type])上,而IDENTITYKeyID上。此信息应在问题中。重要的是要了解正在发生的事情。

您将副本的HRCo设置为6,因此我认为这保证了新的主键是唯一的。

对于KeyIDIDENTITY列将在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'

请注意,我从KeyIDINSERT语句中都删除了SELECT列。

答案 1 :(得分:1)

如果您正在使用

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

您不必设置PK值。 例如,如果您的PK是KeyID,则从INSERT中删除此列。

会是这样的:

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

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