【问题标题】:Primary Key Constraint Violation when trying to insert DISTINCT values尝试插入 DISTINCT 值时违反主键约束
【发布时间】:2015-04-07 10:20:15
【问题描述】:
insert into MemberGroup (MemberId, MemberGroupId, MemberJoinDate, MemberExpiryDate)
   SELECT DISTINCT 
       TransMemberId, 404, MAX(transaction_time), 
       dateadd(yy,1,MAX(transaction_time))
   FROM 
       DataTrans 
   INNER JOIN 
       DataTransItem ON DataTransId = DataTransItemId
   LEFT JOIN 
       MemberGroup ON MemberId = DataTransItemId
   INNER JOIN 
       MemberMembership ON MemberId = MembershipId
   INNER JOIN 
       LinkedMember ON MembershipId = LinkedMemberId
   WHERE 
       membership_clubid = 1 
       AND TransMemberId IN (select LinkedMemberId from LinkedMember)
       AND TransMemberId IN (select LinkedMemberId from LinkedMember 
                             where MemberGroupId NOT IN (1, 2, 3, 4, 5))
       AND TransMemberId IN (select MemberLinkedId from LinkedMember 
                             where DataTransItemId = 2414)
   GROUP BY 
      TransMemberId

为什么这会返回以下错误,即使它在插入语句中使用了 distinct 并且最后将 TransMemberId 分组以选择一个。

违反主键约束“PK_MembershipGroup”。无法在对象“dbo.MemberGroup”中插入重复键。重复键值为 (FFASED487948KXWC1MH7, 404)。

DataTransId
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11

TransMemberId
F123TK1TSXX7
F123TK1TSXX7
F123TK1TSXX7
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
48232423KXWC1MH7
48232423KXWC1MH8
48232423KXWC1MH9
F2P3XQTTRJ44232423
F2P3XQTTRJ44232424
F2P3XQTTRJ44232425
F2P3XQTTRJ44232426
F2P3XQTTRJ44232427

DataTransItemId
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11
1.24322E+11

MembershipId
F123TK1TSXX7
F123TK1TSXX7
F123TK1TSXX7
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
48232423KXWC1MH7
48232423KXWC1MH8
48232423KXWC1MH9
F2P3XQTTRJ44232423
F2P3XQTTRJ44232424
F2P3XQTTRJ44232425
F2P3XQTTRJ44232426
F2P3XQTTRJ44232427

LinkedMemberId
F123TK1TSXX7
F123TK1TSXX7
F123TK1TSXX7
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
KS723423CLG8LSQ
48232423KXWC1MH7
48232423KXWC1MH7
48232423KXWC1MH7
F2P3XQTTRJ44232423
F2P3XQTTRJ44232423
F2P3XQTTRJ44232423
F2P3XQTTRJ44232423
F2P3XQTTRJ44232423

MemberLinkedId
48KXWC1MH7ASGER
48KXWC1MH7ASGER
48KXWC1MH7ASGER
LKJDJX2RQ26Y7VD
LKJDJX2RQ26Y7VD
LKJDJX2RQ26Y7VD
LKJDJX2RQ26Y7VD
LKJDJX2RQ26Y7VD
F1TK1TSXX723FSDE
F1TK1TSXX723FSDE
F1TK1TSXX723FSDE
Z3VHVL846QQWER
Z3VHVL846QQWER
Z3VHVL846QQWER
Z3VHVL846QQWER
Z3VHVL846QQWER

【问题讨论】:

  • MemberGroup 是空表吗?当你有GROUP BY 时,你不需要DISTINCTdateadd(yy,1,MAX(transaction_time)) 应该在GROUP BY 之后。
  • 谢谢,不,这不是一张空桌子。我正在尝试将值插入到成员组中,其中 LinkedMember 表中链接的成员在 ID 为 1、2、3、4 和 5 的成员组中不存在
  • 澄清一下,如果我在没有惰性不同部分的情况下执行 select * 语句,我们将因此显示多条记录。有什么方法可以在没有 Group By 或 Distinct 的情况下选择唯一的成员 ID?你能在内部联接上做 UNION 吗?
  • 您选择部分的结果不是唯一的吗?你能给出一些示例数据吗?
  • 我猜肯定有FFASED487948KXWC1MH7已经在表中

标签: sql sql-server


【解决方案1】:

我认为您的查询可以是这样的:

 insert into MemberGroup (MemberId, MemberGroupId, MemberJoinDate, MemberExpiryDate)
 (SELECT TransMemberId , 404, MAX(transaction_time), dateadd(yy,1,MAX(transaction_time))

 FROM DataTrans 
      INNER JOIN DataTransItem ON DataTransId = DataTransItemId
      LEFT JOIN MemberGroup ON MemberId = DataTransItemId
      INNER JOIN MemberMembership ON MemberId = MembershipId
      INNER JOIN LinkedMember ON MembershipId = LinkedMemberId

 WHERE membership_clubid = 1 
      AND TransMemberId IN (select LinkedMemberId from LinkedMember where MemberGroupId NOT IN (1, 2, 3, 4, 5))
      AND TransMemberId IN (select MemberLinkedId from LinkedMember where DataTransItemId = 2414)

 GROUP BY TransMemberId)

如您所见;这条线索的结果:

WHERE TransMemberId IN (select LinkedMemberId from LinkedMember)
    AND TransMemberId IN (select LinkedMemberId from LinkedMember where MemberGroupId NOT IN (1, 2, 3, 4, 5))

和这条线索一样:

WHERE TransMemberId IN (select LinkedMemberId from LinkedMember where MemberGroupId NOT IN (1, 2, 3, 4, 5))

【讨论】:

  • 不能在用于 GROUP BY 子句的 group by 列表的表达式中使用聚合或子查询。我也搞砸了抱歉,DataTransItemId 应该处于不同的状态,因为它使用 MemberLinkedId(这几乎是第一个链接的辅助成员)
  • @EriadoraOtsito 作为您的编辑我更改了查询,但在分组后我错过了)
  • 不,抱歉仍在尝试插入重复值。
  • @EriadoraOtsito 我需要一个重复数据的示例;)。
  • No MemberGroupId 不是我表上的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2022-01-06
  • 2012-07-15
  • 2021-12-11
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多