2017-09-18 5 views
0

私は一見したところではかなり馬鹿に見えますが(エラーメッセージは十分説明力があるようです)、実際には以下の結果に応じて、より無Idsが大きくなっているバグやコーナーケース...私はSQL Server 2014 - 既存の "重複"がないため、プライマリキーの列に値を挿入できません

完全に混乱している私は、SQL挿入コード

USE Broker2 
GO 

DBCC CHECKIDENT ('Broker2.dbo.Properties'); 
DBCC CHECKIDENT ('Broker2.dbo.Properties', RESEED, 9999); 
GO 

SET IDENTITY_INSERT Broker2.dbo.Properties ON 

INSERT INTO Broker2.dbo.Properties 
(Id, IsActive, Phone, Phone2, [Address], ExhibitionPoleId, RegionId, PropertyTypeId, FurnishingId, Price, IsDeposited, DepositAmount, IsArchived, 
CreatedOn, IsDeleted, OfficeId, DealTypeId, AssignedTo, HasTransition, BrokerNote) 
SELECT 
    convert(int, '10000' + convert(varchar, cp.Id)), 
    cp.is_active, 
    (select SUBSTRING(op.phone, 0, 11) from recrm_merged.dbo.contact_phones op where op.id = ccp.id) as phone, 
    (select SUBSTRING(op.phone, 12, 35) from recrm_merged.dbo.contact_phones op where op.id = ccp.id) as phone2, 
    cp.[address], 
    me.broker_id, 
    mr.Broker_Id, 
    mp.Broker_Id, 
    mf.Broker_Id, 
    cp.price, 
    cp.with_deposit, 
    0, 
    case when cp.property_status_id = 1 then 0 else 1 end as IsArchived, 
    cp.created_at, 
    0, 
    2, 
    md.Broker_Id, 
    cp.bound_to_broker_id, 
    0, 
    (cp.[description] + '; ' + cp.furniture_details) 
FROM recrm_merged.dbo.properties cp 
    join recrm_merged.dbo.contacts cc on cp.contact_id = cc.Id 
    join recrm_merged.dbo.contact_phones ccp on cc.id = ccp.contact_id 
    join Broker2.dbo.map_exhibition_types me on cp.exposure_id = me.crm_id 
    join Broker2.dbo.map_regions mr on cp.district_id = mr.Crm_Id 
    join Broker2.dbo.map_property_types mp on cp.property_type_id = mp.Crm_Id 
    join Broker2.dbo.map_furnishings mf on cp.furnishing_id = mf.Crm_Id 
    join Broker2.dbo.map_deal_types md on cp.action_type_id = md.Crm_Id 

SET IDENTITY_INSERT Broker2.dbo.Properties OFF 

の下に、私はまた、このテーブルを持っている「プロパティ」、 8469

select top 1000 * from Properties 
order by id desc -- results in 8469, 8468, 8467 ... 

このエラーが表示されることは少なくありません。 "PRIMARY KEY制約 'PK_dbo.Properties'違反。オブジェクト 'dbo.Properties'に重複キーを挿入できません。重複したキー値が(100003)である。」

テーブルrecrm_merged.dbo.propertiesから非常に最初のIDレコードが、私は、Management Studioを再起動万

で開始すること、新たに移したIDを持つ必要がある3です。誰かが肩を与える場合、それははるかにappriciatedされるだろうPCおよびオフにして、自分の部屋で点灯しますが、問題は消えません...

EDIT

select * from recrm_merged.dbo.properties 
where Id = 3 -- returns only 1 record. 

USE [Broker2] 
GO 

/****** Object: Index [PK_dbo.Properties] Script Date: 18.9.2017 г. 21:46:00 ******/ 
ALTER TABLE [dbo].[Properties] ADD CONSTRAINT [PK_dbo.Properties] PRIMARY KEY CLUSTERED 
(
    [Id] 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) 
GO 

EDIT 2

実際、私のセレクトは3つのレコードを返してくれました。これはどのように可能ですか

Id is_active phone phone2 address broker_id Broker_Id Broker_Id Broker_Id price with_deposit (No column name) IsArchived created_at (No column name) (No column name) Broker_Id bound_to_broker_id (No column name) (No column name) 
100003 0 0889525467  басанович 9 4 221 11 1 260 0 0 1 2016-05-05 17:30:32 0 2 1 NULL 0 ; 
100003 0 123123  басанович 9 4 221 11 1 260 0 0 1 2016-05-05 17:30:32 0 2 1 NULL 0 ; 
100003 0 aaaa  басанович 9 4 221 11 1 260 0 0 1 2016-05-05 17:30:32 0 2 1 NULL 0 ; 
+0

PRIMARY KEY制約違反は、主キーの重複値をテーブルに挿入しようとしていることを意味します。テーブルスキーマ情報を投稿して、プライマリキーが何であるかを確認してください。 –

+1

ここでは多くの詳細を扱うことはできません。しかし、私はあなたが3の値を持つあなたのselectステートメントに1つ以上の行を持っていると思う。それはそれが主キーの制約に違反するため、挿入に失敗します。 –

+0

そう、ショーンが言ったように、これは、あなたが3のidであなたのレコードを複製することを期待しているよりも、ジョインがもう少し多くの参加をしている問題です。 – 0x11

答えて

0

あなたの結合は、クロス乗算と重複の作成です。 1つ以上のテーブルに多対1のリレーションシップがあるか、またはジョイン条件が不完全です。

はあなたの重複を見つけるために、これを実行してみてください:

SELECT cp.ID, COUNT(*) 
FROM recrm_merged.dbo.properties cp 
    join recrm_merged.dbo.contacts cc on cp.contact_id = cc.Id 
    join recrm_merged.dbo.contact_phones ccp on cc.id = ccp.contact_id 
    join Broker2.dbo.map_exhibition_types me on cp.exposure_id = me.crm_id 
    join Broker2.dbo.map_regions mr on cp.district_id = mr.Crm_Id 
    join Broker2.dbo.map_property_types mp on cp.property_type_id = mp.Crm_Id 
    join Broker2.dbo.map_furnishings mf on cp.furnishing_id = mf.Crm_Id 
    join Broker2.dbo.map_deal_types md on cp.action_type_id = md.Crm_Id 
group by cp.ID 
having count(*) > 1 

そこからあなたが掘ると重複を作成しているの参加を見つける必要があります。

あなたはすべてのレコードがcp.IDに固有であることを行っている特定のなら、あなたはdistinctでそれを修正することができる場合があります盲目的にあなたが停止する必要があり、このメソッドを使用する前に、しかし

SELECT DISTINCT 
    convert(int, '10000' + convert(varchar, cp.Id)), 
    cp.is_active, 
    (select SUBSTRING(op.phone, 0, 11) from recrm_merged.dbo.contact_phones op where op.id = ccp.id) as phone, 
    (select SUBSTRING(op.phone, 12, 35) from recrm_merged.dbo.contact_phones op where op.id = ccp.id) as phone2, 
    cp.[address], 
    me.broker_id, 
    mr.Broker_Id, 
    mp.Broker_Id, 
    mf.Broker_Id, 
    cp.price, 
    cp.with_deposit, 
    0, 
    case when cp.property_status_id = 1 then 0 else 1 end as IsArchived, 
    cp.created_at, 
    0, 
    2, 
    md.Broker_Id, 
    cp.bound_to_broker_id, 
    0, 
    (cp.[description] + '; ' + cp.furniture_details) 
FROM recrm_merged.dbo.properties cp 
    join recrm_merged.dbo.contacts cc on cp.contact_id = cc.Id 
    join recrm_merged.dbo.contact_phones ccp on cc.id = ccp.contact_id 
    join Broker2.dbo.map_exhibition_types me on cp.exposure_id = me.crm_id 
    join Broker2.dbo.map_regions mr on cp.district_id = mr.Crm_Id 
    join Broker2.dbo.map_property_types mp on cp.property_type_id = mp.Crm_Id 
    join Broker2.dbo.map_furnishings mf on cp.furnishing_id = mf.Crm_Id 
    join Broker2.dbo.map_deal_types md on cp.action_type_id = md.Crm_Id 

なぜ重複が発生しているのかを理解してください。

+0

ええと...私はジョイントを1つ除外し、 recrm_merged.dbo.contact_phonesに参加するcc.id = ccp.contact_id 'contact_idの返信としてロジックが1つ以上のレコード..... 問題が解決されました – ppenchev

+1

最初のカウントのほんの少しの例 - それは'... count(1)> 1'が必要ですが、cp.Id> 1はありません。 – ppenchev

+0

@ppenchevおっと!それは正解です。一定。 –

0

キーを設定しないでください。アイデンティティ指定のテーブルの「Id」列を「Is Identity = Yes」に変更します。これはあなたのIDを処理します。それからあなたは挿入物からそれを取り除き、あなたは金色です。次に、1対多の関係から返された値を重複してもクラッシュすることはありません。

関連する問題