日期:2014-05-16  浏览次数:20570 次

ORA-02299错误

my:就是表中已经存在属性一样的几行了,再加unique自然会出错.
今天,给一个表加多列唯一约束时出错。SQL语句:ALTER TABLE orgid ADD UNIQUE(orgidtypcd, idnbr);
错误信息: ORA-02299:无法验证(OSIBANK.SYS_C20952)-找到重复关键字
莫不是有多条记录的orgidtypcd,idnbr两列同时相同。check一下,检查sql如下:
SELECT orgidtypcd, idnbr, COUNT(*) amt
FROM orgid
GROUP BY orgidtypcd, idnbr
ORDER BY amt DESC;

ORGIDTYPCD IDNBR AMT
1 3
0 888 1
0 2703 1
0 9000 1

看来是null值在捣乱,?orgidtypcd为1,同时idnbr为null的列有三列。这就是为什么多列唯一约束建立不起来的原因。(OSIBANK.SYS_C20952是系统给这个约束自动起的名。)

参考Metalink信息:
原因:(1)null代表数据缺失,一个null不存在与任何值(包括其它null)等或者不等。所以,在给单列加Unique约束时,是允许为它存在多个null的。(2)在组合键中,只要不为null的keys都对应相等,那么Oracle会把null的keys矣为相等。比方说,一个有三列组成(A,B,C)的组合唯一约束。如果C列为null,那么两条记录是否违反唯一约束,就看另外两列是否对应相等。如 (1,2,null) 和 (1,2,null)就视为违反唯一性约束。
解决方法:就是让他们真正变得唯一。可以给null值列赋不同值,也可以修改组合键中非null列,让重复的记录不完全相同。


?

?