日期:2011-01-25 22:55:00 来源:本站整理
Oracle数据库中违反唯一约束的处理-入门底子[Oracle防范]
本文“Oracle数据库中违反唯一约束的处理-入门底子[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
按照NULL的定义,NULL表示的是未知,因此两个NULL对比的后果既不相等,也不不等,后果仍旧是未知.按照这个定义,多个NULL值的存在应当不违反唯一约束.
实际上Oracle也是如此实现的:
SQL> CREATE TABLE T (ID NUMBER);
表已成立.
SQL> ALTER TABLE T ADD UNIQUE (ID);
表已更改.
SQL> INSERT INTO T VALUES (1);
已成立 1 行.
SQL> INSERT INTO T VALUES (1);
INSERT INTO T VALUES (1)
*第 1 行呈现错误:
ORA-00001: 违反唯一约束条件 (YANGTK.SYS_C007300)
SQL> INSERT INTO T VALUES (NULL);
已成立 1 行.
SQL> INSERT INTO T VALUES (NULL);
已成立 1 行.
SQL> INSERT INTO T VALUES (NULL);
已成立 1 行.
但是当唯一约束为复合字段时,则情形发生了改变.按照Oracle文档的描写,关于复合字段的唯一约束,不为空字段的值是不能反复的.也就是说,假如两个字段构成了一个唯一约束,此中一个字段为空,那么另一个字段的值不能呈现反复.
SQL> DROP TABLE T PURGE;
表已删除.
SQL> CREATE TABLE T (ID NUMBER, ID2 NUMBER);
表已成立.
SQL> ALTER TABLE T ADD UNIQUE (ID, ID2);
表已更改.
SQL> INSERT INTO T VALUES (1, 1);
已成立 1 行.
SQL> INSERT INTO T VALUES (1, NULL);
已成立 1 行.
SQL> INSERT INTO T VALUES (2, NULL);
已成立 1 行.
SQL> INSERT INTO T VALUES (1, NULL);
INSERT INTO T VALUES (1, NULL)
*第 1 行呈现错误:
ORA-00001: 违反唯一约束条件 (YANGTK.SYS_C007301)
SQL> INSERT INTO T VALUES (NULL, NULL);
已成立 1 行.
SQL> INSERT INTO T VALUES (NULL, NULL);
已成立 1 行.
SQL> INSERT INTO T VALUES (NULL, NULL);
已成立 1 行.
关于全部为NULL的情形,仍旧和单字段唯一约束一样,不会造成反复,但是关于部份为NULL的情形,就如上面例子所示,只要此中不为NULL的部份发生了反复,Oracle就认为约束发生了反复.
而这仿佛和NULL的定义有所冲突,第一次看concept的时刻一向没有搞懂得Oracle为什么这么实现,不过这次再看concept的时刻,已经想懂得了.
由于Oracle的唯一约束是依靠索引实现的,而Oracle的BTREE索引又是不存储NULL值的,所以键值全部为NULL的记录不会记录在索引中,因此也就不会违反唯一约束了,而关于部份为NULL的记录,索引是要记录数值的,因此一旦键值中非NULL部份发生了冲突,Oracle就认为违反了的唯一约束.
Oracle在这里还是挑选了自己的便利的办法来实现,而没有完好真正的按照NULL的定义去实现唯一约束
以上是“Oracle数据库中违反唯一约束的处理-入门底子[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论