ORA-00001违反了唯一约束(string.string)

时间:2013-03-14 15:09:15

标签: sql oracle plsqldeveloper

我有两个彼此相同的表t1t2,但t2的数据多于t1。 我正在使用此查询将缺失的数据从t2插入t1

insert into t1
select * from t2
where not exist ( select * from t1
                  where t1.key1 = t2.key1
                  and t1.key2 = t2.key2)

运行此查询时,我得到:ORA-00001唯一约束(string.string)违反错误。

这两个表格以key1key2为键。

由于唯一的约束是两个键,我不明白为什么我会收到这个错误。

编辑:我现在注意到“索引”中有2个约束都是唯一类型。

第一个是:key1,random_column 第二个是:key2

抱歉给您带来不便。

2 个答案:

答案 0 :(得分:1)

如果对唯一约束有不同的理解,我假设唯一约束是两个字段上的唯一索引。如果你对key1有一个唯一的约束,而对key2有一个唯一的约束,那么当t1中的记录具有相同的t2.key1值但是t2.key2值不同时,这将失败,因为添加记录将导致两个t1中的记录具有相同的key1值,这是由key1上的唯一约束禁止的。

如果这是您所拥有的,则需要具有两个字段的唯一索引,而不是列约束。

一种可能性是t2中的值具有NULL key1或NULL key2。

在表达式中,NULL输入始终导致NULL结果,该结果被视为false。

因此,如果t2具有NULL key1的记录和key2的值'value2',那么where子句正在评估

select * from t1
where t1.key1 = NULL and t1.key2 = 'value2'

这不等于

select * from t1
where t1.key1 is NULL and t1.key2 = 'value2'

而不是t1.key1 = NULL将是不真实的,select将无法返回结果,exists将为false而NOT(exists)将为true。但是如果t1已经有这样的记录,那么唯一约束就会失败。

所以请使用此insert语句。

insert into t1
select * from t2
where not exist ( select * from t1
                  where (t1.key1 = t2.key1 or (t1.key1 is null and t2.key1 is null))
                  and (t1.key2 = t2.key2 or (t1.key2 is null and t2.key2 is null)))

答案 1 :(得分:0)

使用 MINUS 结果集操作的理想情况

insert into t1
select * from t2
minus
select * from t1