2013-03-14 152 views
0

我有两个相互相同的表t1t2,但t2具有比t1更多的数据。 我正在使用此查询来将t2中缺失的数据插入到t1ORA-00001违反的唯一约束(string.string)

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

的在什么栏理想的情况下是唯一的约束? – JMan 2013-03-14 15:11:29

+0

它击中的错误之一。我试图只使用弹出错误消息的where语句之一。但是我得到相同的错误信息。 – 2013-03-14 15:15:39

回答

1

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

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

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

在一个表达式中,NULL输入总是会导致NULL结果被认为是错误的。

所以,如果T2与NULL key1的记录和“值”对键2的值,则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将无法返回结果,存在将为false,NOT(存在)将为true。但是如果t1已经有这样的记录,那么唯一的约束将会失败。

所以使用这个插入语句。

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

如果你想检查相等性和NULL值是否相等,你可以使用'WHERE DECODE(t1.key1,t2.key1,1)= 1'而不是'WHERE t1.key1 = t2.key1'。 – Benoit 2013-03-14 15:21:54

+0

值不为空,但检查我的更新:> – 2013-03-14 15:32:22

0

使用减号结果集操作

insert into t1 
select * from t2 
minus 
select * from t1 
相关问题