根据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 数据库约束是一种机制,用于确保数据库数据的完整性和一致性。约束是指在数据库中强制执行某些规则,以确保数据的正确性和一致性。Oracle 数据库提供了多种类型的约束,包括 NOT NULL...
综上所述,Oracle数据库提供了多种确保字段唯一性的方法,包括唯一约束和唯一索引,它们在确保数据完整性、提高查询效率以及处理重复值方面都有各自的特点和适用场景。开发者可以根据具体需求和性能考虑选择合适的...
本文将深入探讨Oracle数据库中的五种主要完整性约束规则:Check、NOT NULL、Unique、Primary Key和Foreign Key。 #### 二、Check约束 Check约束用于验证数据列的值是否满足特定的条件,如数值范围、字符集等。这种...
Oracle 数据库语句大全是 Oracle 数据库管理系统中的一系列语句,用于管理和操作数据库。这些语句可以分为五大类:数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)和事务控制语言(TCL)。 一....
在Oracle数据库的使用中,SQL语句的性能优化至关重要,尤其是在处理大规模数据时。优化SQL语句能够显著提升系统的响应速度,提高系统的可用性和效率。以下是一些关于SQL语句性能调整的重要原则和注意事项: 1. **IS...
约束是确保数据完整性的规则,包括NOT NULL(非空约束)、UNIQUE(唯一约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)和CHECK(检查约束)。它们在数据插入和更新时自动执行,防止不符合规则的数据进入...
《张立国oracle数据库教程》是一份...通过这个教程,读者不仅可以掌握Oracle数据库的基本操作,还能深入了解其在实际应用中的高级特性和设计原则。无论是为了职业发展还是个人兴趣,这都是一份经典且实用的学习资料。
接下来我将详细解释文档中涉及的Oracle数据库相关知识点。 首先,文档中提到了一些关键的Oracle数据库对象,包括: 1. 表(table): 是存储数据的数据库对象,如文档中的“test_tri_tab1”和“test_tri_tab2”。 ...
从给定的文件信息中,我们可以提取到关于Oracle数据库中SQL操作的重要知识点,特别是与创建表、定义主键约束以及插入数据相关的操作。下面将详细解释这些知识点。 ### 创建表 在Oracle数据库中,`CREATE TABLE`...
Oracle数据库提供了多种数据约束,包括NOT NULL约束、UNIQUE约束、PRIMARY KEY约束、FOREIGN KEY约束等。 触发器是指在数据库中自动执行的程序,以确保数据的完整性和一致性。Oracle数据库提供了多种触发器,包括...
总结,Oracle数据库约束是数据完整性的重要保证,理解并正确使用各种约束,能确保数据的准确无误,同时在设计和管理数据库时,需充分考虑其对性能的影响。通过深入学习“Oracle电子文档:数据库约束”,你将能够更...
在Oracle数据库教学中,了解和掌握SQL语言是至关重要的。SQL,全称为Structured Query Language,即结构化查询语言,它是用于管理和处理关系数据库的标准语言,集数据定义、数据查询、数据更新和数据控制四大功能于...
在Oracle数据库中,完整性约束扮演着至关重要的角色,它们是数据库设计的基础,用于维护数据的一致性和防止错误的数据输入。 1. 数据完整性概念: 数据完整性分为三类:实体完整性、参照完整性和用户定义完整性。...
在IT行业中,Oracle数据库是广泛使用的大型关系型数据库管理系统,用于存储和管理大量结构化数据。本主题将探讨如何将TSV(Tab Separated Values,制表符分隔值)文件导入到Oracle数据库中,这是一个常见的数据迁移...
【数据库】Navicat for Oracle 是一款用于管理Oracle数据库的强大工具,它提供了直观的图形界面,使得数据库管理和操作更为便捷。在本实验中,我们将探讨如何通过Navicat for Oracle设置唯一性和递增序列。 **唯一...
1. **段(Segment)**:在Oracle数据库中,段是表空间内的一个逻辑存储单元,它由一个或多个Extent组成。常见的段类型包括数据段(Data Segment)、索引段(Index Segment)、回滚段(Rollback Segment)和临时段...
在Oracle数据库中,NULL值是一种特殊的值,表示未知或不存在的数据。它不同于任何其他值,包括空字符串('')和零。理解Oracle如何处理NULL值是数据库管理与查询中的重要一环,尤其对于数据完整性、查询逻辑以及函数...
Oracle数据库的完整性约束和序列规则是数据库管理中的关键概念,它们确保了数据的准确性和一致性。完整性约束主要有五种类型:Check约束、NOT NULL约束、Unique约束、Primary键约束和Foreign key约束。 Check约束...
在第14章“约束”中,我们深入理解了如何在Oracle数据库中实施约束,以确保数据的完整性和一致性。 约束是Oracle数据库中至关重要的一部分,它们是强制应用于表的一组规则,用来限制可以插入、更新或存在的数据类型...