Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >新增非空约束字段在不同版本中的演进

新增非空约束字段在不同版本中的演进

作者头像
bisal
发布于 2019-01-29 07:30:27
发布于 2019-01-29 07:30:27
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
非空字段空值对查询的影响
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且默认值是”的字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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/45418303 http://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新增默认值非空字段使用数据字典存储的特性,并且做了扩展支持,满足范围更大了。

小问题隐藏了大智慧。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年11月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
YashanDB|给字段加默认值+非空约束竟然报错?来看原因!
在旧版本中,执行顺序先判断表是否为空,后处理默认值写入逻辑,导致当表中已有数据时无法新增带 NOT NULL DEFAULT 的字段。
数据库砖家
2025/04/18
380
【云和恩墨大讲堂】谈Oracle表新增字段的影响
作者简介 刘晨,网名bisal,Oracle 10g/11g OCM,并国内首批Oracle YEP成员,博客:blog.itpub.net/bisal 很多人在做一些表设计时会留出几个reverse
数据和云
2018/03/07
2.5K0
【云和恩墨大讲堂】谈Oracle表新增字段的影响
新增字段的一点一滴技巧
在Oracle中给表新增字段的需求,已经写了不少文章了,太多的经历告诉我们,一个简单的需求,如果不了解背后的原理,就很可能出现性能问题。
bisal
2019/12/25
1.1K0
alter table新增字段操作究竟有何影响?(下篇)
没想到距此篇博文的上半部分发表(http://blog.csdn.net/bisal/article/details/45418303)已经有半年的时间,上篇博文是5月小长假的时候,在开往杭州的高铁上完成的,话说第二天就有了我的小baby:),难道写博客还有助孕的效果?需要的朋友不妨一试,哈哈,归根结底,还是需要作为IT从业者的我们,紧张工作之余,要有放松的安排,不仅是身体上的放松,还要有精神、心灵上的放松,俗话说得好“天空飘来五个字,那都不是事,是事也就烦一会,一会就没事”。
bisal
2019/01/30
7520
深入解析MySQL 8:事务数据字典的变革
在MySQL 8之前的版本中,元数据分散地存储在多个地方,包括元数据文件、非事务性表和特定于存储引擎的数据字典中。这种分散的存储方式不仅增加了管理的复杂性,还可能导致数据的不一致性。为了解决这些问题,MySQL 8引入了事务数据字典,将元数据集中存储在具有事务功能的InnoDB表中,从而提供了一致性和可靠性的保证。
公众号:码到三十五
2024/03/19
1670
Oracle 12c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息
原文链接 http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf 译者 胡红伟 虽然优化器需要准确的统计信息来选择最优的执行计划,但是有些场景下,收集统计信息比较困难,或消耗资源较高,或收集统计信息不能及时完成,那么就需要另一种备选策略。 不稳定的表 不稳定的表即随着时间的变化,数据会发生巨大变化的表。例如,一个订单队列表,一天的开始它是空的,随着时间推移,订
沃趣科技
2018/03/26
1.2K0
Oracle 12c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息
书接上文:薛定谔的猫是如何诞生的?
编辑手记:注重细节,是DBA必要的基本素质要求。 书接上文(参考:空与非空 - 数据库中也有薛定谔的猫?),其实CBO的判断本身是没有问题的,问题在于,为什么一个空值会存在非空约束的字段中。 SQL> select dbms_metadata.get_ddl('TABLE', 'T_DEF') from dual; DBMS_METADATA.GET_DDL('TABLE','T_DEF') ------------------------------------------------------
数据和云
2018/03/06
9690
书接上文:薛定谔的猫是如何诞生的?
sql约束
CREATE TABLE table_name( column_name datetype [not null] [unique key] [primary key] [check(expr)] );
h3110_w0r1d
2024/02/19
1220
MySQL和Oracle的添加字段的处理差别 (r10笔记第73天)
昨天在微信群中有个朋友也是无意中问了一下,说数据库中的表字段想保持一种相对规范的顺序,怎么办?要知道Oracle中这个操作就比较纠结了,因为是按照追加的方式来处理的。没法在已有的字段1,字段2中间添加一个字段3。但是MySQL却可以,这个方面MySQL看起来要灵活的多,这个是什么原因呢,他们在设计上有什么差别呢。 MySQL中对每个表存在一个定义文件,即frm文件,我们来取出一个表,看看能不能简单解析一下。 比如一个表字段的内容如下: > desc zd_warshrine_prostate; +----
jeanron100
2018/03/20
8980
误操作怎么办?试试这个神器-Log Miner
LogMiner可以用来分析在线/redo日志,也可以用来分析离线日志文件/归档日志,是由一组PL/SQL包和一些动态视图组成,而且是免费的。
bisal
2021/09/06
1K0
误操作怎么办?试试这个神器-Log Miner
DDL操作提示了一个DML操作才会抛的ORA错误?
某张表,有个字段,存在默认值,并且设置了NOT NULL约束,例如,NEED_PO VARCHAR2(1) default 'N' not null,
bisal
2019/12/20
6980
DDL操作提示了一个DML操作才会抛的ORA错误?
mysql常见的建表选项和约束
constraint可以给键进行重命名,但是在数据字典中,主键名还是显示primary
h3110_w0r1d
2024/02/19
3570
goldengate同步无主键无唯一索引表的问题以及解决方案--更新关于附加日志
Oracle GoldenGate Command Interpreter for Oracle
徐靖
2020/08/05
2.1K0
goldengate同步无主键无唯一索引表的问题以及解决方案--更新关于附加日志
PG11新特性解读:新增非空默认值字段不需要重写表
在postgresql11之前,为表增加一个包含非空默认值的字段,将会导致表重写,为每一行添加该字段,并填充默认值。如果该表在增加字段前非常大,那么将会非常耗时。
yzsDBA
2020/10/28
1.3K0
试用ODU软件恢复corrupt block
本文介绍了如何使用ODU(Oracle Data User)从快照中恢复数据,并使用ODU将数据导出为CSV文件。通过使用ODU,可以方便地恢复被删除的数据,并将其导出为CSV文件,方便后续使用。
企鹅号小编
2018/01/08
1.6K0
试用ODU软件恢复corrupt block
MySQL 约束
  非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,用户在添加数据时没有指定值,数据库系统就会报错。可以通过 CREATE TABLE 或 ALTER TABLE 语句实现非空。在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。
Demo_Null
2020/09/28
3.1K0
MySQL 约束
MySQL 8.0.19亿级数据如何秒速增加字段?
今天主要介绍一下MySQL 8.0.19 instant add column的新特性,基于亿级数据秒速增加字段,下面一起来看看吧~
IT大咖说
2021/03/14
7.7K0
案例:12.2环境用户登录错误ORA-01017
Keyword: ORA-01017 12.2 authentication SQLNET.AUTHENTICATION_SERVICES sec_case_sensitive_logon
SQLplusDB
2020/03/26
1.9K0
试用ODU软件恢复corrupt block
Oracle的数据恢复处理,有各种方法工具支持,在这方面,我算是一个新手,也是处于不断的学习中。
bisal
2019/01/30
7160
2024Mysql And Redis基础与进阶操作系列(3)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。
盛透侧视攻城狮
2024/10/22
2350
2024Mysql And Redis基础与进阶操作系列(3)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
推荐阅读
相关推荐
YashanDB|给字段加默认值+非空约束竟然报错?来看原因!
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验