当前位置:七道奇文章资讯数据防范Oracle防范
日期: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防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • SQL Server中利用Linkserver衔接Oracle的办法
  • Oracle数据库网络与安全FAQ精辟堆积
  • Ubuntu 9.10下安装Oracle10g
  • Ubuntu 10.04 下安装Oracle 11g
  • oracle盲注报错语句和oracle提权语句汇总
  • oracle中to_char、to_number、to_date的用法
  • Python模拟Oracle的SQL/PLUS工具的实现办法
  • Oracle数据库访谈之最年青的OCM访谈
  • oracle表数据误删复原
  • Oracle数据库笔记--表空间
  • Oracle数据库树形查询的代码示例
  • oracle中记录和调集
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .