(转)Oracle数据库中违背仅有束缚的处理guojizaixian - AG环亚娱乐

(转)Oracle数据库中违背仅有束缚的处理guojizaixian

2019-02-08 11:18:03 | 作者: 昊天 | 标签: 束缚,字段,部分 | 浏览: 5939

      依据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的界说去完成仅有束缚。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章