违反PRIMARY KEY约束。无法复制对象中的键

时间:2014-01-13 19:10:02

标签: sql sql-server

在我的DTSpackage中,我有这个来创建一个表...

CREATE TABLE [fwAIR].[dbo].[tblPRODUCTIVITY] (
    [CMS_Login] varchar (5) NOT NULL, 
    [DeptIndex] tinyint NOT NULL, 
    [CMS_Date] datetime NOT NULL, 
    [AssociateNumber] int NULL, 
    [TotalCalls] smallint NULL, 
    [StaffTime] int NULL, 
    [ACDTime] int NULL, 
    [ACWTime] int NULL, 
    [PureAuxTime] int NULL, 
    [AuxInTime] int NULL, 
    [AuxOutTime] int NULL, 
    [HoldTime] int NULL, 
    [RingTime] int NULL, 
    [AvailableTime] int NULL, 
    [CallTime] int NULL, 
    [TotalNPTMinutes] smallint NULL, 
    [Active] char (1) NULL, 
    [iOther] int NULL, 
    [RcdCreateUser] varchar (15) NULL, 
    [RcdUpdtUser] varchar (15) NULL, 
    [RcdCreateDateTime] datetime NULL, 
    [RcdUpdtDateTime] datetime NULL,
    sdtImportDate smalldatetime NOT NULL DEFAULT GETDATE(),
    CONSTRAINT idxPRODUCTIVITY_PK PRIMARY KEY NONCLUSTERED (DeptIndex, CMS_Login, CMS_Date)
);

CREATE NONCLUSTERED INDEX idxPRODUCTIVITY
ON tblPRODUCTIVITY (AssociateNumber, CMS_Date);

CREATE CLUSTERED INDEX idxPRODUCTIVITY_DeptIndex_Date
ON tblPRODUCTIVITY (DeptIndex, CMS_Date);

当我将文本文件导入此表时,出现以下错误。

  

错误源:用于SQL Server的Microsoft OLE DB提供程序

     

错误说明:执行时报告失败。该   声明已经终止。违反PRIMARY KEY约束   “idxProductivity_PK”。无法在对象中插入重复键   'tblProductivity'。

我在线阅读我可以添加到创建表部分

ALTER INDEX idxPRODUCTIVITY_PK on fwAIR.dbo.tblPRODUCTIVITY
SET (IGNORE_DUP_KEY = ON);

但被告知它不起作用,它仍然会出错。我被告知我也可以“创建模仿IX并添加该选项”。哪个应该有用。

在摆脱这个错误并让它继续导入时,我有点迷失。

4 个答案:

答案 0 :(得分:2)

我建议你创建一个临时表,其中所有列都是varchar()(或nvarchar())。

将数据导入登台表。然后尝试从那个创建实际的表。

如果您在第一步中遇到问题,那么数据文件可能不是您认为的格式。如果您在第二步中遇到问题,可以参考实际数据查看内容问题是。

答案 1 :(得分:2)

将数据导入临时表,一旦在sql server中有数据,就保持数据类型尽可能丢失。

根据需要消除任何重复项和更多数据操作,然后将数据插入到实际目标数据中。

将数据直接导入表格绝不是一个好主意。如果您的源文件中有任何垃圾数据,它可能会让您做很多清理工作。 :)

答案 2 :(得分:1)

这不是错误。您的表定义表示不允许在DeptIndex, CMS_Login and CMS_Date列中包含2个(或更多)具有相同值的行。这是表中每行的主键(或唯一标识符)..

所以:

  1. 如果应该允许,那么你删除或修改主键约束,使它包含一个应该是唯一的列组合(改变它就像你尝试过的那样对主键不起作用) 或
  2. 您手动从输入数据中删除重复项,然后重新尝试

答案 3 :(得分:1)

如果您遇到主键违规,那是因为1)您尝试导入的文件中有重复的行或2)如果您的表有数据,您尝试导入的文本文件中有一个表格中的相同行。

您需要做的是1)删除主键或2)更改组成键的列,以使行真正唯一。

要找出您的行是重复的,您可以删除:

CONSTRAINT idxPRODUCTIVITY_PK PRIMARY KEY NONCLUSTERED (DeptIndex, CMS_Login, CMS_Date));

导入文本文件,然后运行此SELECT语句:

SELECT DeptIndex, CMS_Login, CMS_Date 
FROM [fwAIR].[dbo].[tblPRODUCTIVITY] 
GROUP BY DeptIndex, CMS_Login, CMS_Date 
HAVING COUNT(*) > 1