【问题标题】:Merge sql throws Unique constraint violation error合并sql抛出唯一约束冲突错误
【发布时间】:2021-04-16 09:23:52
【问题描述】:

当我查询表 TEST_RUA 时,我有以下两个表:

select  CLASS, ID_LL, ID_UU, TKR from TEST_RUA   where ID_UU= 'GV9999B12M0'

它返回:

CLASS    ID_LL   ID_UU          TKR
Bond    (null)  GV9999B12M0     WIB

当我查询表TEST_RUA_MER时:

select CLASS, ID_LL, ID_UU, TKR from TEST_RUA_MER   where ID_UU= 'GV9999B12M0'

它返回:

CLASS    ID_LL   ID_UU          TKR
Bond    (null)  GV9999B12M0     WIB

您可以看到ID_UU= 'GV9999B12M0' 所在的表的两个值相同。表 TEST_RUA_MER 在列 ID_LL, ID_UU, TKR 上具有唯一索引。

现在我有下面的合并查询,它抛出错误为ORA-00001: unique constraint violated,我不明白如何避免这个错误,因为两个表值都相同,那么在这种情况下,这个合并查询应该尝试更新而不是插入表中TEST_RUA_MER.

merge into TEST_RUA_MER h   using  (    
select distinct r.CLASS, r.ID_LL, r.ID_UU, r.TKR from TEST_RUA r   ) s 
on (s.ID_LL=h.ID_LL and s.ID_UU=h.ID_UU  and s.TKR=h.TKR) when matched then   
update set h.CLASS = s.CLASS, h.ID_LL = s.ID_LL, h.ID_UU = s.ID_UU, h.TKR = s.TKR
when not matched then   insert values (s.CLASS, s.ID_LL, s.ID_UU, s.TKR);

【问题讨论】:

  • 我现在已经更正了这个问题

标签: sql oracle merge unique-constraint


【解决方案1】:

看起来NULL 会导致问题;它不“等于”任何东西,所以:

on (s.ID_LL=h.ID_LL 

失败。

试试

on (nvl(s.ID_LL, -1) = nvl(h.ID_LL, -1)

(取决于ID_LL 列的数据类型;我假设它是一个数字)。

【讨论】:

  • ID_LL, ID_UU, TKR 数据类型为 varchar2
  • 好的,所以用一些字符代替-1。
  • 我不知道如何,但使用 -1 也可以工作,但我以后会产生问题吗?
【解决方案2】:

是的,正如另一个答案中提到的,错误的原因是s.ID_LL=h.ID_LL。您可以将其更新为

( s.ID_LL=h.ID_LL OR (s.ID_LL is null and h.ID_LL is null) )

( s.ID_LL=h.ID_LL OR coalesce(s.ID_LL, h.ID_LL) is null )

【讨论】:

  • 现在我面临性能问题...我尝试了 sql 和我的合并查询花费了 20 多分钟并且它仍在运行..没有这种情况它会在几秒钟内运行...我有我的表 TEST_RUA_MER 中有 800000 行...我试图删除此表上的索引,但合并查询仍然需要太多时间..
  • 我可以在这里创建功能索引吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2011-04-01
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多