合并 sql 抛出违反唯一约束的错误
Merge sql throws Unique constraint violation error
我有以下两个 table,当我查询时 table TEST_RUA
:
select CLASS, ID_LL, ID_UU, TKR from TEST_RUA where ID_UU= 'GV9999B12M0'
它returns:
CLASS ID_LL ID_UU TKR
Bond (null) GV9999B12M0 WIB
当我查询时 table TEST_RUA_MER
:
select CLASS, ID_LL, ID_UU, TKR from TEST_RUA_MER where ID_UU= 'GV9999B12M0'
它returns:
CLASS ID_LL ID_UU TKR
Bond (null) GV9999B12M0 WIB
您可以看到 table 和 ID_UU= 'GV9999B12M0'
的两个值相同。 table TEST_RUA_MER
在列 ID_LL, ID_UU, TKR
上有唯一索引。
现在我有下面的合并查询,它抛出 ORA-00001: unique constraint violated
错误,我不明白如何避免这个错误,因为两个 table 值都相同,那么在这种情况下,这个合并查询应该尝试更新而不是插入 table 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);
看起来 NULL
有问题;它不“等于”任何东西,所以:
on (s.ID_LL=h.ID_LL
失败。
试试
on (nvl(s.ID_LL, -1) = nvl(h.ID_LL, -1)
(取决于 ID_LL
列的数据类型;我推测它是一个数字)。
是的,正如另一个答案中提到的,错误的原因是 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 )
我有以下两个 table,当我查询时 table TEST_RUA
:
select CLASS, ID_LL, ID_UU, TKR from TEST_RUA where ID_UU= 'GV9999B12M0'
它returns:
CLASS ID_LL ID_UU TKR
Bond (null) GV9999B12M0 WIB
当我查询时 table TEST_RUA_MER
:
select CLASS, ID_LL, ID_UU, TKR from TEST_RUA_MER where ID_UU= 'GV9999B12M0'
它returns:
CLASS ID_LL ID_UU TKR
Bond (null) GV9999B12M0 WIB
您可以看到 table 和 ID_UU= 'GV9999B12M0'
的两个值相同。 table TEST_RUA_MER
在列 ID_LL, ID_UU, TKR
上有唯一索引。
现在我有下面的合并查询,它抛出 ORA-00001: unique constraint violated
错误,我不明白如何避免这个错误,因为两个 table 值都相同,那么在这种情况下,这个合并查询应该尝试更新而不是插入 table 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);
看起来 NULL
有问题;它不“等于”任何东西,所以:
on (s.ID_LL=h.ID_LL
失败。
试试
on (nvl(s.ID_LL, -1) = nvl(h.ID_LL, -1)
(取决于 ID_LL
列的数据类型;我推测它是一个数字)。
是的,正如另一个答案中提到的,错误的原因是 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 )