运维教程-书接上文:薛定谔的猫是如何诞生的?

跨零代码为大家提供高品质的解决方案,请大家多多来访,跨零不胜感激,在此谢过。

书接上文:薛定谔的猫是如何诞生的?

编辑手记:注重细节,是DBA必要的基本素质要求。

上一篇文章讨论了非空字段中如果存在空值对于查询的影响,这里描述一下导致问题的原因。
书接上文(参考:空与非空 – 数据库中也有薛定谔的猫?),其实CBO的判断本身是没有问题的,问题在于,为什么一个空值会存在非空约束的字段中。

之前提到,由于TYPE列具有非空约束,导致CBO给出的执行计划返回了错误的结果,但是问题的根源在于,为什么Oracle会允许空值插入到非空约束字段中:

那么是什么情况导致了错误的数据绕过了Oracle的检查呢。检查表的定义,发现一个特别之处,TYPE列的默认值本身就是NULL,是不是这个导致了Oracle的数据问题呢:

显然问题没有那么简单,虽然默认值人为设置为NULL并不常见,但是对于哪些具有NOT NULL约束且没有指定默认值的列,都相当于默认值为NULL。显然不太可能是常规问题导致的bug,Oracle经过这么多年这么多版本的磨练,应该不会在11g还出现这种问题,而且这个问题还是第一次碰到。综上所述,推断问题可能是11g新特性所引入的bug。
分析到这里,问题的答案也呼之欲出了,没错,导致问题的就是11g新增的快速添加非空默认值的功能,这个诡异的问题可以通过下面的三步简单的重新:

Oracle确实允许NOT NULL列的默认值为NULL,如果不指定默认值那么就相当于默认值为NULL,但是对于11g新增的新特性而言,DEFAULT为NULL是要禁止的,否则就会导致现有记录的NOT NULL字段出现NULL值。

而且由于指定的DEFAULT是NULL,ECOL$中居然没有记录任何信息:

看来任何新特性都难以避免BUG的产生,没想到一个增加非空默认值的新特性也会引发BUG。

文:杨廷琨

文章出处:Oracle

从零到一,创造未来!跨零综合IT问题解决服务站,欢迎你的到来。运维教程 只为你绽放。

本文固定链接: http://kua0.com/2019/01/07/运维教程-书接上文:薛定谔的猫是如何诞生的?/

为您推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注