• --:)欢迎访问锋网源码(:--
  • 首页
  • RSS订阅
  • 常用软件
  • 网页模板
  • 网站运作
  • 锋网学院
  • 繁體中文

  • 学院首页
  • 新闻资讯
  • 网站运营
  • 网站开发
  • 美工设计
  • 数据库类
  • 服务器类
  • 网络应用
  • 操作系统
  • 软件教学
编程开发   认证考试   网络安全   文章搜索: 高级搜索
会员登录/控制面版 您的位置: 学院首页 >> 数据库类 >> 文章内容
 

精彩推荐

 
 

本类推荐文章

  • ACCESS集锦
 
 

本类阅读排行

  • 用SQL实现分布式数据复制
  • 数据库聊天室的“无刷新”技..
  • SQL语言快速入门之一 &..
  • 用Access 2000进行班级管理
  • Delphi中的Access技巧集
  • 浅谈ACCESS数据库升迁SQLSER..
  • 如何更改Access默认的中文输..
  • SQL Server 连接基础知识
  • 检查sql字符串中是否有单引号..
  • 基于WEB的数据库查询
  • ORACLE学习笔记--性能优化
  • ACCESS集锦
  • 能否编译mdb文件到exe文件?
  • ado如何使用sql函数?
  • 建立Access 数据库的安全门
  • Oracle数据库维护常用SQL语句..
  • Oracle数据库维护常用SQL语句..
  • 在 Access 中使用“存储过程..
  • Access 的最大容量
  • Vista下安装SQL Server 2005..
 
 

Oracle 数据库唯一约束中的NULL的处理

  • 日期:2008-09-08     人气:     出处:     作者:
  • 字体大小:
  • 小
  • 中
  • 大

根据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 10g实用程序trcsess:跟踪sql语句
  • Oracle Developer 2000中的一些实用语句
  • Oracle 10g DBMS_SCHEDULER的中度解析
  • Oracle 9i中OCCI在VC6下不能DEBUG的问题
  • Oracle 10g手工创建数据库个人经验
  • Oracle 10G里手工建库的全过程
  • Oracle listener静态注册和动态注册总结
  • Oracle 10g使用RMAN创建physical standby
  • Oracle DBMS_JOB:每隔特定时间执行特定任务
  • Oracle 2008年7月紧急补丁更新修复多个漏洞
相关软件

  • 网友评论:
  • 查看所有评论
  • 我要发表评论
 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 加入收藏 | 帮助中心 |

Copyright © 2006-2007 fwvv.net  程序支持:木翼  皖ICP备06004916号