Sql server 插入查询中违反主键约束,未触及PK列

Sql server 插入查询中违反主键约束,未触及PK列,sql-server,sql-server-2012,sql-server-2014,Sql Server,Sql Server 2012,Sql Server 2014,我有一个在表中插入记录的查询。该表的主键列是一个自动递增的标识字段。查询的select部分将有重复项,但我有一个唯一的约束,在字段city\u nm、prov\u en\u nm上有ignore\u dup\u key=on,插入时应跳过它们。这过去很管用,但出于某种原因,现在它给了我这个信息。这是自数据库从2012年的sql server迁移到2014年后我第一次尝试它,如果这会产生影响的话 Violation of PRIMARY KEY constraint 'Dim_city_provi

我有一个在表中插入记录的查询。该表的主键列是一个自动递增的标识字段。查询的select部分将有重复项,但我有一个唯一的约束,在字段city\u nm、prov\u en\u nm上有ignore\u dup\u key=on,插入时应跳过它们。这过去很管用,但出于某种原因,现在它给了我这个信息。这是自数据库从2012年的sql server迁移到2014年后我第一次尝试它,如果这会产生影响的话

Violation of PRIMARY KEY constraint 'Dim_city_province_country_pk'. Cannot insert duplicate key in object 'HD_DtlClm.dim_city_province_country_t'. The duplicate key value is (###). (where ### is an ID, a different one every time I run it)
这是问题所在

INSERT INTO HD_DtlClm.[dim_city_province_country_t] (
    city_nm, prov_en_nm, prov_fr_nm, contry_fr_nm, contry_en_nm
    )
SELECT  gr_mbr_city_nm, PROV_ENG_NM, PROV_FR_NM, CONTRY_ENG_NM, CONTRY_FR_NM
FROM    isu.gr_dentl_clm_v 
    LEFT JOIN HD_DtlClm.province_information_t 
    ON gr_dentl_clm_v.gr_mbr_prov_cd = HD_DtlClm.province_information_t.PROV_CLM_CD
UNION
SELECT  gr_prvdr_city_nm, PROV_ENG_NM, PROV_FR_NM, CONTRY_ENG_NM, CONTRY_FR_NM
FROM    isu.gr_dentl_clm_v 
    LEFT JOIN HD_DtlClm.province_information_t 
    ON gr_dentl_clm_v.gr_prvdr_prov_cd IN (HD_DtlClm.province_information_t.PROV_ENG_CD, HD_DtlClm.province_information_t.PROV_CLM_CD)
你知道我为什么会犯过去没有的错误吗

编辑以添加主键创建脚本:

ALTER TABLE [HD_DtlClm].[dim_city_province_country_t] ADD  CONSTRAINT [Dim_city_province_country_pk] PRIMARY KEY CLUSTERED 
(   [cpc_key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,     IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
EDIT2添加表创建脚本

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [HD_DtlClm].[dim_city_province_country_t](
    [cpc_key] [int] IDENTITY(1,1) NOT NULL,
    [city_nm] [char](50) NOT NULL,
    [prov_en_nm] [char](50) NULL,
    [prov_fr_nm] [char](50) NULL,
    [contry_en_nm] [char](75) NULL,
    [contry_fr_nm] [char](75) NULL,
    [create_ts] [datetime] NOT NULL,
    [update_ts] [datetime] NOT NULL,
 CONSTRAINT [Dim_city_province_country_pk] PRIMARY KEY CLUSTERED 
(
    [cpc_key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [dim_city_province_country_ak1] UNIQUE NONCLUSTERED 
(
    [city_nm] ASC,
    [prov_en_nm] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [HD_DtlClm].[dim_city_province_country_t] ADD  DEFAULT (getdate()) FOR [create_ts]
GO

ALTER TABLE [HD_DtlClm].[dim_city_province_country_t] ADD  DEFAULT (getdate()) FOR [update_ts]
GO

尝试运行:DBCC CHECKIDENT'HD\u DtlClm.[dim\u city\u province\u country\t];查看messages选项卡中返回的结果,确保当前标识值等于或高于当前列值。注意:运行此命令甚至可以自行修复问题


展开:看起来有什么东西为您的标识列重新设定了种子,因此插入导致拾取重复项。不要认为有任何方法可以从历史上检验是什么改变了它;最可能的候选者是带有重新设定种子选项的DBCC CHECKIDENT命令,或者截断操作将重新设定种子为原始值。

您能否提供Dim_city_province_country_pk的create语句。复制错误的示例记录也会有帮助。添加了创建脚本,不确定复制错误的示例记录的含义可以添加表创建脚本吗?表上有任何触发器吗?cpc_键是否定义为标识列?如果没有,那么它是如何填充的?它必须以某种方式填充,因为它是主键。