ORA-00001违反的唯一约束(string.string)
我有两个相互相同的表t1
和t2
,但t2
具有比t1
更多的数据。 我正在使用此查询来将t2
中缺失的数据插入到t1
。ORA-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)违反错误。
这两个表格有key1
和key2
作为键。
由于唯一的约束是两个键我不明白为什么我得到这个错误。
编辑:我注意到现在在“索引”中有2个约束都是类型唯一的。
第一个是:KEY1,random_column 第二个是:KEY2
遗憾的不便。
为了防止对唯一约束有不同的理解,我假设唯一约束是两个字段上的唯一索引。如果你在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)))
如果你想检查相等性和NULL值是否相等,你可以使用'WHERE DECODE(t1.key1,t2.key1,1)= 1'而不是'WHERE t1.key1 = t2.key1'。 – Benoit 2013-03-14 15:21:54
值不为空,但检查我的更新:> – 2013-03-14 15:32:22
使用减号结果集操作
insert into t1
select * from t2
minus
select * from t1
的在什么栏理想的情况下是唯一的约束? – JMan 2013-03-14 15:11:29
它击中的错误之一。我试图只使用弹出错误消息的where语句之一。但是我得到相同的错误信息。 – 2013-03-14 15:15:39