`
liwenshui322
  • 浏览: 519317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)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 中的约束错误是指在数据库中违反了约束条件,导致数据无法修改或删除的错误。这种错误通常发生在父表和子表之间存在关联关系时,试图删除或修改父表中的记录,但子表中存在对应的记录。 约束是指数据库中的...

    基于Oracle的数据库完整性约束分析.pdf

    在Oracle数据库中,完整性约束扮演着至关重要的角色,它们是数据库设计的基础,用于维护数据的一致性和防止错误的数据输入。 1. 数据完整性概念: 数据完整性分为三类:实体完整性、参照完整性和用户定义完整性。...

    oracle电子文档:数据库约束.rar

    在Oracle数据库中,约束是确保数据完整性和准确性的关键工具。本电子文档“Oracle电子文档:数据库约束”深入探讨了这个重要主题,帮助读者理解和掌握如何在Oracle环境中有效地实施和管理数据库约束。 一、数据库...

    Oracle数据库Constraint约束的常用操作及异常处理[归类].pdf

    在约束操作中可能会出现一些异常,例如数据违反约束、语句执行失败等。在这种情况下,需要使用EXCEPTIONS INTO子句来捕获和处理异常,例如: ```sql ALTER TABLE dept ENABLE CONSTRAINT pk_dept EXCEPTIONS INTO ...

    oracle数据库中ora-报错原因及处理

    例如,"ORA-00001"表示唯一性约束违反,"ORA-01422"意味着查询返回过多的行,而"ORA-29913"通常涉及到执行外部过程时的问题。这些错误代码帮助DBA(数据库管理员)快速定位问题,进行相应的故障排查和修复。 处理...

    Oracle错误码大全 oracle数据库

    这个错误码表示“唯一性约束违反”,意味着在执行插入或更新操作时,试图插入的数据违反了某个唯一性约束,如主键或唯一索引。解决这类问题通常需要检查数据的输入,确保没有重复值进入系统。 "Oracle错误码大全...

    oracle数据库错误大全

    1. **错误代码及其解释**:每个错误代码都有详细的解释,描述了错误发生的情况,例如违反了唯一性约束(ORA-00001),内部错误(ORA-600)或资源耗尽(ORA-4031)。 2. **错误解决方案**:除了错误解释,大全还会...

    Oracle唯一约束.txt

    本篇文章将详细探讨Oracle数据库中唯一约束的定义、创建方法以及相关的应用场景。 #### 一、唯一约束的定义 唯一约束(UNIQUE constraint)是Oracle数据库提供的用于限制表中某些列的值的唯一性的机制。它可以应用...

    oracle数据库-错误编码大全

    在Oracle数据库中,唯一约束(UNIQUE CONSTRAINT)用于确保表中没有重复的值。当尝试插入或更新数据导致违反已定义的唯一约束条件时,数据库将抛出ORA-00001错误。解决此问题通常需要重新检查插入或更新的数据,确保...

    Oracle数据库补考试题[参照].pdf

    1. 实例服务:Oracle数据库实例服务是指运行在数据库服务器上的一个服务,负责处理客户端的请求。在题目中提到的选项中,`OracleServicedb01`通常代表一个数据库实例的服务名,允许客户端通过网络连接到特定的数据库...

    oracle中如何创建约束?

    在Oracle数据库中,创建约束是确保数据完整性和一致性的重要手段。约束可以分为多种类型,包括主键(PRIMARY KEY)、外键(FOREIGN KEY)、唯一(UNIQUE)、非空(NOT NULL)以及检查(CHECK)约束。本文将重点讨论...

    Oracle数据库实验操作

    ### Oracle数据库实验操作知识点 #### 第一部分:SQL基础 ##### 基本查询语句 - **实验1:** 编写一个简单的SQL查询语句,用于查询表中的所有行和所有列。例如: ```sql SELECT * FROM 表名; ``` - **实验2:**...

    oracle数据库常见错误码

    例如,错误码ORA-00001表示“唯一性违反”,意味着试图插入或更新的数据违反了唯一性约束。 Oracle错误码通常包含以下部分: 1. 错误码(Error Code):这是识别错误的数字标识。 2. 错误消息(Error Message):...

    Oracle导入CSV格式数据

    Oracle数据库是世界上最广泛使用的数据库系统之一,特别是在企业级应用中。CSV(Comma Separated Values)格式是一种常见的数据交换格式,因其简洁明了而被广泛应用。本篇文章将深入探讨如何在Oracle数据库中导入CSV...

    消除行迁移与Oracle数据库性能调优.pdf

    总之,理解并有效地处理Oracle数据库中的行迁移问题,对于提升数据库性能和保证系统稳定运行至关重要。通过运用各种清除方法,结合业务场景和数据库管理工具,可以显著改善数据库的性能,提高数据处理速度,减少不必...

    oracle 数据库错误一览表

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级应用中占据着重要的地位。在使用Oracle数据库的过程中,由于各种原因,用户可能会遇到各种错误。这篇内容将深入解析Oracle数据库的一些常见错误...

    Oracle 数据库错误消息查询帮助文档

    例如,ORA-00001错误表示违反了唯一性约束,意味着试图插入或更新的数据违反了表中的某个唯一索引或主键约束。 3. **解决方案或建议**:帮助文档会提供解决错误的步骤或建议,这可能包括检查数据的完整性、修改SQL...

    ORACLE数据库选择题.docx

    在Oracle数据库中,题目涉及了多个关键知识点,包括SQL语句的使用、数据库约束、DDL语句、视图创建、事务处理以及更新查询等。以下是对这些知识点的详细解释: 1. ORA-02292错误:当尝试更新一个具有外键约束的表时...

    MLDN魔乐科技JAVA培训_Oracle课堂17_约束.rar

    这个课程可能由MLDN(魔乐科技)提供,是一个专业的JAVA培训系列的一部分,主要讲解在Oracle数据库环境中如何使用和管理约束。 在数据库系统中,约束是用于确保数据完整性的规则。它们是数据库设计的重要组成部分,...

    oralce第12讲-23讲wmv版 java操作oracle、oracle的事务、函数、数据库管理约束索引权限角色

    在本课程中,我们主要探讨了Oracle数据库与Java编程相结合的应用,以及Oracle数据库的一些核心概念和技术,包括事务处理、函数、数据库管理、约束、索引、权限和角色。以下是详细的知识点总结: 1. **Java操作...

Global site tag (gtag.js) - Google Analytics