【问题标题】:Violation of PRIMARY KEY constraint Msg 2627 Cannot insert duplicate key违反 PRIMARY KEY 约束 Msg 2627 无法插入重复键
【发布时间】:2013-07-12 16:28:17
【问题描述】:

我遇到了主键违规问题,但我不知道如何解决。实际的错误信息是;

消息 2627,级别 14,状态 1,第 1 行违反主键 约束“PK_infmtx_dat_Transactions”。无法插入重复键 在对象“dbo.infmtx_dat_Transactions”中。

我的代码如下:

INSERT INTO infmtx_dat_Transactions (tranid,chgid,chgidagnst,incnumagnst,rptpd,aid,claimid
,chgsvcpd,trantype,doschg,doscalpd,postdtchg,postdtchgcalpd,postdttran
,postdttrancalpd,depositdt,depositcalpd,cptid,cptcode,cptcomp,billprov
,rendprov,facid,posid,dptid,priminsmne,priminscatid,transcode,crcat
,refprovid,modalid,units,adjunits,patcnt,enccnt,cptcnt,amt,chgallow
,totworkrvu,totfacrvu,denial,curresponsible,curbal,curinsmne
,curopenbalflag,curcreditbalflag,denyflag,denycode,denydate,feetypeid )
SELECT
trn.tran_id
,trn.chg_id
,chg.chgidagnst
,chg.incnumagnst
,trn.rptpd
,trn.acctid
,chg.claimid
,chg.rptpd
,tcd.trantype
,chg.doschg
,chg.doscalpd
,chg.postdtchg
,chg.postdtchgcalpd
,trn.tranpostdt
,trn.tranpostpd
,trn.pmtdate
,trn.pmtpd
,chg.cptid
,chg.cptcode
,chg.cptcomp
,chg.billprov
,chg.rendprov
,chg.facid
,chg.posid
,chg.dptid
,chg.priminsmne
,chg.priminscatid
,trn.payermne
,tcd.crcat
,chg.refprovid
,chg.modalid
,0
,0
,0
,0
,0
,trn.trnamt
,chg.chgallow
,0
,0
,0
,''
,0
,''
,'N'
,'N'
,'N'
,''
,Null
,chg.feetypeid
FROM tmp_dat_OtherTrans trn
LEFT JOIN infmtx_dat_Transactions chg on trn.chg_id = chg.tranid AND trn.chg_id = chg.chgid
AND trn.chg_id = chg.chgidagnst 
LEFT JOIN infmtx_dic_TransCode tcd on trn.payermne = tcd.trancodemne
ORDER BY trn.tran_id;

如何设置查询以查找重复记录。
infmtx_dat_Transactions表的主键是:tranid,chgid,chgidagnst,rptpd和trantype

【问题讨论】:

  • 那张桌子上你的主键是什么?

标签: sql-server


【解决方案1】:

主键(和其他候选键)防止插入重复值,因此您无法搜索它们。不存在重复项。

相反,在您尝试插入的新数据中找到主键(和其他候选键)值,然后搜索它们。其中一个肯定在您的新数据中重复,或者已经在您的表中。

看起来您可以通过在源表“tmp_dat_OtherTrans”(包括其连接)和“infmtx_dat_Transactions”之间执行内部连接来识别现有表中的冲突键。

【讨论】:

  • 我添加了内部连接,它起作用了,我确实找到了重复项
【解决方案2】:
WITH duplicate_check AS (
  SELECT 
    *,ROW_NUMBER() OVER(PARTITION BY key_column1,key_column2,key_column3 ORDER BY (SELECT NULL))) AS n
  FROM table_with_suspect_data
SELECT
  *
FROM duplicate_check
WHERE n > 1

对于每个重复项删除除一个之外的所有行:

 WITH duplicate_check AS (
  SELECT 
    *,ROW_NUMBER() OVER(PARTITION BY key_column1,key_column2,key_column3 ORDER BY (SELECT NULL))) AS n
  FROM table_with_suspect_data
DELETE
FROM duplicate_check
WHERE n > 1

【讨论】:

  • WITH duplicate_check AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY tranid,chgid,chgidagnst,rptpd,trantype)) AS n FROM tmp_dat_OtherTrans ORDER BY ROWNUMBER,tranid SELECT * FROM duplicate_check WHERE n > 1
  • 使用上面的代码我得到一个错误 Msg4112。排名函数“ROW_NUMBER 必须有 ORDER BY 子句。我尝试添加一个,但仍然收到错误消息
  • 因为我知道我的 tmp_dat_OtherTrans 表中有重复项,这导致了我的问题。我想删除我的重复记录。我写了查询: DELETE FROM tmp_dat_OtherTrans WHERE tran_id NOT IN (SELECT MAX(tran_id) FROM tmp_dat_OtherTrans WHERE tran_id = 1187461 GROUP BY tran_id, chg_id, rptpd) 发生的情况是查询删除了除了三个重复记录之外的所有记录。查询有什么问题?
猜你喜欢
  • 2014-06-30
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多