开发提了一个数据库变更需求,新增一字段,没有NOT NULL非空约束,但有默认值为NULL。看起来有些奇怪,因为若字段允许NULL,其默认值就是NULL,不用显示声明,可以创建一个无DEFAULT NULL的新增字段再查看desc表结构,就可以证明这点。

基于这问题,引申出的NOT NULL字段问题还有不少,也是比较容易忽视的一些细节,例如杨长老最近连续发表过两篇关于NOT NULL字段的文章确实很有启发,

非空字段空值对查询的影响:http://yangtingkun.net/?p=1481

非空字段空值的产生:http://yangtingkun.net/?p=1483

具体各位可以参考这两篇博文,简单总结一下,11.2.0.3的库,

1.使用where type is null和is not null得到的记录结果判断值为非空。

2.使用dump(type)和nvl(type, ‘is null’)得到的记录结果判断值为空。 表定义中此字段为DEFAULT ” NOT NULL,事实证明(2)是正确的,之所以有(1)的结论,原因是CBO太智能了。 对于IS NOT NULL,type字段定义为NOT NULL,此SQL明显违反了表中的约束条件,则会在执行计划最上层增加一个NULL IS NOT NULL恒为假的条件,根本不需要真正执行这个SQL,直接返回0条记录。 对于IS NULL,由于查询条件满足约束的条件,因此Oracle会做全表扫描,并且省略了type is not null的过滤,直接返回所有记录,就造成了type非空的假象。 出现以上问题的核心,还是为何有为空的记录存储于有NOT NULL非空约束的表中。原因就是11g新特性,新增一个有默认值的NOT NULL约束的字段,默认值不会像以前一样,插入每条记录中,而是会存储于一张数据字典表sys.ecol$,Oracle允许NOT NULL列默认值为NULL,因此对于11g来说,需要禁止DEFAULT为NULL的这种行为。

这种新增非空约束字段在不同版本中确实有一些细节的变化,下面做一些简单测试。 首先,创建测试表,插入一条数据,新增列为NOT NULL且默认值是”的字段:

create table bisal (id number);

insert into bisal values(1);

alter table bisal add name varchar2(10) default '' not null;

10.2.0.3库,从报错信息看ORA-01407,不能更新NAME列为空,可以看出此时是要将表中已存在记录的新列name做UPDATE设置为默认值的操作,由于有非空约束,因此不允许。

11.2.0.1库,可以新增字段,表中已存记录该值确实为空,即允许一个有NOT NULL约束的字段包含NULL值。

关于这新特性的好处,可以参考之前写的 《alter table新增字段操作究竟有何影响?(上下篇)》http://blog.csdn.net/bisal/article/details/45418303http://blog.csdn.net/bisal/article/details/49182025

12.1.0.2库,我们可以看出和10g一样,禁止新增一个默认值为NULL的NOT NULL约束字段,但报错信息变了,ORA-01758: table must be empty to add mandatory (NOT NULL) column,这个错误号在之前的版本有定义,不是新号。

根据错误提示,我们删除表中数据,再新增字段,可以增加,但不能再插入一条NULL至这个非空约束字段。

我们再看下官方文档的描述,11g中对于新增默认值字段的描述部分,明确指出NOT NULL约束包含默认值的情况下,是将默认值存储于数据字典中。

12c中描述允许为空的字段,若有默认值,不会更新已存数据,而是会借助数据字典完成存储,这种新特性的适用范围更广了。

由于我没有12c的sys真实环境,朋友可以自己尝试下,有机会我会自己再验证下。

至此,12c修复了11g中这个非空约束字段允许保存空值的bug,同时又支持11g新增默认值非空字段使用数据字典存储的特性,并且做了扩展支持,满足范围更大了。

小问题隐藏了大智慧。

java fx 的演进版本_新增非空约束字段在不同版本中的演进相关推荐

  1. [JavaWeb-MySQL]约束(非空约束,唯一约束,主键约束,外键约束_级联操作)

    约束 * 概念: 对表中的数据进行限定,保证数据的正确性.有效性和完整性. * 分类:1. 主键约束:primary key2. 非空约束:not null3. 唯一约束:unique4. 外键约束: ...

  2. 列中的空值违反了非空约束_管理社区中违反准则的情况

    列中的空值违反了非空约束 You run an active (or maybe not-so-active) community. You have a vision for this commun ...

  3. Java 自定义注解实现springMVC 参数校验非空判断,为空 则返回响应为空信息

    欢迎关注博主公众号:[纯洁的明依]文章由陈晓阳原创. 本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料. 简单概括定义注解的步骤以及作用: 一:明确注解的使用空间(类 方法 等) ...

  4. 2019-7-26 [MySQL] 安装与介绍 语句分类/语法 数据类型 DDL数据定义:创建/查看/删除/使用 DML数据操作:增删改 主键约束 自动增长列 非空约束 默认值 Navicat

    文章目录 0.知识回顾 1.数据库介绍 1.1 数据库概述 1.1.1 什么是数据库 1.1.2 什么是数据库管理系统 1.1.3 数据库与数据库管理系统的关系 1.2 数据库表 1.3 表数据 1. ...

  5. mysql建表语句非空约束默认_Navicat mysql 建表字段 默认值 空白、NULL 、empty string的区别...

    总结在最后,没啥干货 新建一张用户表CREATE TABLE `user` ( `id` bigint(20) DEFAULT NULL COMMENT '编号', `name` varchar(64 ...

  6. MySQL约束-自增长约束(auto_increment)、非空约束(not null)、唯一约束(unique)

    目录 自增长约束概念 特点 自增字段初始值 delete和truncate在删除后自增列的变化 非空约束概念 删除非空约束 唯一约束概念 文末资源推荐 每文一语 自增长约束概念 在 MySQL 中,当 ...

  7. 【MySQL - 5】约束是什么?非空约束、唯一约束、主键约束、外键约束有什么作用?

    目录 1. 非空约束 2. 唯一约束 3. 主键约束 自动增长 4. 外键约束 级联操作 首先我们来想象一下,前几篇文章在我们操作数据库的过程中,自由度是很高的,想给哪个赋值就给哪个赋值,但是这样子, ...

  8. 六、约束(主键约束、唯一约束、非空约束、检查约束、外键约束)

    ## 约束,数据类型,触发器 ## 保证数据的正确性,完整性,有效性 /*主键约束唯一约束非空约束检查约束 (mysql8才有)外键约束默认值约束 */ 1.主键约束 ## 主键约束: 唯一非空 ## ...

  9. 数据的完整性(正确性和准确性):分类-实体完整性:主键约束、唯一约束、自动增长列。域完整性-非空约束、默认值约束、检查约束。引用完整性-一对一、一对多、多对多

    文章目录 1 数据的完整性作用 2 完整性的分类 2.1 实体完整性 2.1.1 主键约束 primary key 2.1.2 唯一约束 unique 2.1.3 自动增长列 auto_increme ...

  10. 非空约束对数据更新的影响

    正如"非空约束"表达的意思,如果对一个字段添加了非空约束,那么我们是不能将这个字段中的值更新为NULL的.T_Debt表的FAmount字段是有非空约束的,如果我们执行下面SQL: ...

最新文章

  1. SpringBoot 并发登录人数控制
  2. 048_String对象
  3. source tree 递归子模块_每日刷题3--漫谈二叉树的递归遍历
  4. 文章页点赞php代码,wordpress文章页面添加点赞功能
  5. 频域补零上采样_AURIX 学习笔记(12)频域法互相关实现超声测距
  6. poj 1634 Who's the boss?
  7. EMMA 覆盖率工具
  8. jquery级试题_jQuery经典面试题及答案精选
  9. Python-在线文本情感分析实验
  10. 用__postback传递JavaScript变量到c#(pass a js variable to C# by a __postback )
  11. 10月25日-10月29日一周宣讲会安排
  12. flink的window,时间语义,watermark,状态编程,容错机制checkpoint
  13. 《网络黑白》一书所抄袭的文章列表
  14. ABB机器人编程随记
  15. LruCache的基本用法
  16. python入门小项目 | 开发一个《小猫抓鱼》小游戏
  17. NumPy的数组对象:ndarray
  18. 红外热成像仪原理与用途——TFN TD97 双目手持热像仪红外夜视仪
  19. (转载)2010年股市只要读懂这篇文章想亏钱都难
  20. 华为笔试:字符串加密(python版)

热门文章

  1. Apache新成员:LinkedIn分布式数据集成框架Gobblin
  2. 面试题31:连续子数组的最大和
  3. 转: 在CentOS 6.X 上面安装 Python 2.7.X
  4. bash中的特殊文件夹
  5. jquery UI 框架
  6. myeclipse 8.0GA 安装注册步骤
  7. React router 路由 入门安装
  8. Css实现页面元素置顶时悬浮
  9. Phycharm下载并安装
  10. aclocal-1.16:未找到命令