2017-01-20 12 views
0

レコードをテーブルに挿入するクエリがあります。その表の主キー列は、自動インクリメントするIdentityフィールドです。クエリの選択部分に重複がありますが、挿入時にスキップしなければならないフィールド(city_nm、prov_en_nm)のignore_dup_key = onというユニークな制約があります。これはうまく動作するために使用されましたが、何らかの理由で今このメッセージが表示されます。それが影響を及ぼす可能性がある場合、データベースが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:主キーの作成スクリプトを追加する

EDIT DBCC CHECKIDENT( 'HD_DtlClmを[dim_city_province_country_t]');メッセージ・タブ&に戻された結果を見て、現在のID値が現在の列値以上であることを確認します。これを実行しているNBは、問題自体を修正することさえできます。

拡張する:あなたのID列が再シードされたように見えるため、挿入によって重複が拾われていました。歴史的に何が変わったのかをチェックする方法はないと思ってください。最も可能性の高い候補は、RESEEDオプションを指定したDBCC CHECKIDENTコマンドまたはTRUNCATE操作です(元の値に再シードされます)。

関連する問題