在插入查询中违反主键约束而未触及PK列

时间:2017-01-20 16:22:50

标签: sql-server sql-server-2012 sql-server-2014

我有一个在表中插入记录的查询。该表的主键列是一个自动递增的标识字段。查询的选择部分将有重复,但我有一个唯一的约束,其中字段(city_nm,prov_en_nm)上的ignore_dup_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

1 个答案:

答案 0 :(得分:1)

尝试运行:DBCC CHECKIDENT('HD_DtlClm。[dim_city_province_country_t]');查看消息标签中返回的结果&确保当前标识值等于或高于当前列值。 NB运行它甚至可以解决问题本身。

要展开:看起来某些东西已经重新植入了您的标识列,因此插入会导致拾取重复项。不要以为有任何方法可以在历史上检查是什么改变了它;最可能的候选者是具有RESEED选项的DBCC CHECKIDENT命令,或TRUNCATE操作(将重新设置为原始值)。

相关问题