2017-01-20 2 views
0

레코드를 테이블에 삽입하는 쿼리가 있습니다. 해당 테이블의 기본 키 열은 자동 증가하는 ID 필드입니다. 쿼리의 선택 부분에 중복이 생깁니다. 그러나 ignore_dup_key = on이라는 고유 한 제약 조건이 필드 (city_nm, prov_en_nm)에 삽입되어 있으면 무시해야합니다. 이 잘 작동하는 데 사용되는,하지만 지금은 내게이 메시지를 준다. 데이터베이스가 2012 년 SQL 서버에서 영향을받을 수있는 경우 2014로 이동 했으므로 처음 시도합니다.PK 쿼리에 삽입 쿼리의 기본 키 제약 조건이 적용되지 않습니다.

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) 

내가 과거에 얻지 못한이 오류가 발생하는 이유는 무엇입니까? 테이블 작성 스크립트를

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 
+2

Dim_city_province_country_pk에 대한 create 문을 제공 할 수 있습니까? 오류를 재생산하는 샘플 레코드도 도움이됩니다. –

+0

작성 스크립트를 추가했는데 오류를 재현하는 샘플 레코드에 대한 의미가 확실하지 않습니다 – Traceur

+0

테이블 작성 스크립트를 추가 할 수 있습니까? – SqlZim

답변

1

시도 실행을 추가

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 :

편집은 기본 키 생성 스크립트를 추가하는 DBCC CHECKIDENT를 ('HD_DtlClm [dim_city_province_country_t].'); 메시지 탭 &에서 반환 된 결과를 살펴보면 현재 ID 값이 현재 열 값 이상인지 확인하십시오. NB가이를 실행하면 문제 자체가 해결 될 수도 있습니다.

확장하려면 : 귀하의 신원 열을 다시 시드 한 것처럼 보이므로 삽입물이 중복을 일으키고 있습니다. 역사적으로 무엇이 바뀌 었는지 확인할 방법이 없다고 생각하지 마십시오. 가장 가능성이 큰 후보는 RESEED 옵션이있는 DBCC CHECKIDENT 명령이거나 TRUNCATE 작업입니다 (원래 값으로 다시 시드됩니다).