我有两个彼此相同的表t1
和t2
,但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)违反错误。
这两个表格以key1
和key2
为键。
由于唯一的约束是两个键,我不明白为什么我会收到这个错误。
编辑:我现在注意到“索引”中有2个约束都是唯一类型。
第一个是:key1,random_column 第二个是:key2
抱歉给您带来不便。答案 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