专栏首页bisal的个人杂货铺新增字段在数据块中的体现

新增字段在数据块中的体现

前几天同事提了一个问题,比较有意思,如果一张表新增字段,在数据块上是怎么存储的?是直接“加”到数据块中,还是通过其他的形式,表示新的字段?让我们从Oracle数据块内容,看下他到底是怎么存储的。

创建测试表,插入两条数据,

SQL> create table testadd(id number, name varchar2(1));
Table created.

...

SQL> select * from testadd;
 ID N
---------- -
  1 a
  2 b

我们从数据块中能看到这两条记录,

block_row_dump:
tab 0, row 0, @0x1f98
tl: 8 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 1]  61
tab 0, row 1, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 03
col  1: [ 1]  62

场景一

增加一个字段,不带默认值,不带非空约束,

SQL> alter table testadd add a1 varchar2(1);
Table altered.

此时的数据块,无任何的变化,标记表的字段,仍然是两个,

block_row_dump:
tab 0, row 0, @0x1f98
tl: 8 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 1]  61
tab 0, row 1, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 03
col  1: [ 1]  62

如果更新已存在的一条数据的这个新增字段,

SQL> update testadd set a1='a' where id=1;
1 row updated.

SQL> commit;
Commit complete.

我们看到,第一条记录的cc已经改成了3,同时多了col 2这个新增字段的列,但是第二条记录,仍是两个字段,

tab 0, row 0, @0x1f86
tl: 10 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [ 2]  c1 02
col  1: [ 1]  61
col  2: [ 1]  61
tab 0, row 1, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03
col  1: [ 1]  62

如果新增记录,

SQL> insert into testadd values(3, 'c', 'c');
1 row created.

SQL> commit;
Commit complete.

我们看到数据块中的第三条新增记录,已经包含了三个字段,

tab 0, row 0, @0x1f86
tl: 10 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [ 2]  c1 02
col  1: [ 1]  61
col  2: [ 1]  61
tab 0, row 1, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03
col  1: [ 1]  62
tab 0, row 2, @0x1f7c
tl: 10 fb: --H-FL-- lb: 0x2  cc: 3
col  0: [ 2]  c1 04
col  1: [ 1]  63
col  2: [ 1]  63

说明当增加一个不带默认值,不带非空约束的字段时,只有当该字段存储值,数据块中才会为其实际存储。

场景二

增加一个字段,带默认值,不带非空约束,

SQL> alter table testadd add a2 varchar2(1) default 'a';
Table altered.

此时我们看到,数据块中都实际存储了这个新增字段,至于原因,同学们应该了解,新增带着默认值,不带非空约束的字段,其实会执行一个全表更新的操作,会实际为该新增字段插入数据, 具体可参考《新增字段的一点一滴技巧》,

tl: 12 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 02
col  1: [ 1]  61
col  2: [ 1]  61
col  3: [ 1]  61
tab 0, row 1, @0x1f65
tl: 11 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 03
col  1: [ 1]  62
col  2: *NULL*
col  3: [ 1]  61
tab 0, row 2, @0x1f59
tl: 12 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 04
col  1: [ 1]  63
col  2: [ 1]  63
col  3: [ 1]  61

P.S. 应该是存储顺序上的需求,第二个字段原先未实际存储的第三个列此时做了占位。

场景三

增加一个字段,带默认值,带非空约束,

SQL> alter table testadd add a3 varchar2(1) default 'a' not null;
Table altered.

新增的a3字段已经有了值,

SQL> select id, name, a1, a2, a3 from testadd;
 ID   NAME  A1 A2 A3
----- ------ -- -- --
  1    a     a  a  a
  2    b        a  a
  3    c     c  a  a

但是此时数据块,并未实际存储这个新增字段,

tab 0, row 0, @0x1f70
tl: 12 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 02
col  1: [ 1]  61
col  2: [ 1]  61
col  3: [ 1]  61
tab 0, row 1, @0x1f65
tl: 11 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 03
col  1: [ 1]  62
col  2: *NULL*
col  3: [ 1]  61
tab 0, row 2, @0x1f59
tl: 12 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 04
col  1: [ 1]  63
col  2: [ 1]  63
col  3: [ 1]  61

如果此时新增一条记录,

SQL> insert into testadd values(4, 'd', 'a', 'a', 'a'); 
1 row created.

SQL> commit;
Commit complete.

此时数据块中,第四条记录,已经包含了五个字段,其他记录,仍是四个字段,

tab 0, row 0, @0x1f70
tl: 12 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 02
col  1: [ 1]  61
col  2: [ 1]  61
col  3: [ 1]  61
tab 0, row 1, @0x1f65
tl: 11 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 03
col  1: [ 1]  62
col  2: *NULL*
col  3: [ 1]  61
tab 0, row 2, @0x1f59
tl: 12 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 04
col  1: [ 1]  63
col  2: [ 1]  63
col  3: [ 1]  61
tab 0, row 3, @0x1f4b
tl: 14 fb: --H-FL-- lb: 0x2  cc: 5
col  0: [ 2]  c1 05
col  1: [ 1]  64
col  2: [ 1]  61
col  3: [ 1]  61
col  4: [ 1]  61

如果更新一条已存在的记录,

SQL> update testadd set a3='a' where id=1;
1 row updated.

SQL> commit;
Commit complete.

可以看到,第一条记录已经包含了五个字段,其他未更新记录,仍是四个字段,说明当增加一个带默认值,带非空约束的字段时,只有当该字段存储值,数据块中才会为其实际存储,

tab 0, row 0, @0x1f3d
tl: 14 fb: --H-FL-- lb: 0x1  cc: 5
col  0: [ 2]  c1 02
col  1: [ 1]  61
col  2: [ 1]  61
col  3: [ 1]  61
col  4: [ 1]  61
tab 0, row 1, @0x1f65
tl: 11 fb: --H-FL-- lb: 0x0  cc: 4
col  0: [ 2]  c1 03
col  1: [ 1]  62
col  2: *NULL*
col  3: [ 1]  61
tab 0, row 2, @0x1f59
tl: 12 fb: --H-FL-- lb: 0x0  cc: 4
col  0: [ 2]  c1 04
col  1: [ 1]  63
col  2: [ 1]  63
col  3: [ 1]  61
tab 0, row 3, @0x1f4b
tl: 14 fb: --H-FL-- lb: 0x0  cc: 5
col  0: [ 2]  c1 05
col  1: [ 1]  64
col  2: [ 1]  61
col  3: [ 1]  61
col  4: [ 1]  61

根据以上三个场景的测试,新增字段是否存在于数据块中,取决于几个条件,

  1. 新增字段带默认值的情况下,是否设置了非空约束。
  2. 该字段是否包含了值(包含让default设置的)。
  3. 该字段即使为空,但是在他之后,新增了其他包含值的字段,则该字段会在数据块中显示为*NULL*的占位。

无论什么问题,实践是检验真理的唯一标准。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • laravel 增加不存在数据库的字段

    作者:浮生若梦似水流年_ 链接:https://www.jianshu.com/p/b3778e996c3a 來源:简书 简书著作权归作者所有,任...

    全栈程序员站长
  • 新增非空约束字段在不同版本中的演进

    开发提了一个数据库变更需求,新增一字段,没有NOT NULL非空约束,但有默认值为NULL。看起来有些奇怪,因为若字段允许NULL,其默认值就是NULL,不用显...

    bisal
  • SQL数据库-新增字段时,给默认值的方法

    alter table 表名 ADD 字段 int NOT NULL DEFAULT 0

    Lic工作室
  • 在TP5数据库中四个字段实现无限分类的示例

    以上这篇在TP5数据库中四个字段实现无限分类的示例就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • Flowportal.Net BPM中拒绝后更新数据库字段的方法

    今天FlowPortal.Net群里有人提问一个问题,希望能在流程被拒绝后,更改流程对应数据库中的指定字段值,这个其实很简单啦,FlowPortal提供了很强大...

    崔文远TroyCui
  • mysql数据库中指定值在所有表中所有字段中的替换

    憨批程序员
  • 利用easyui实现增删改查(三):后端传到前段的男女是数字,可是在前段要显示汉字

    Formatter 在对应的字段标签里面有列的属性,这个值是一个函数,在这个函数里面进行判断数字,之后返回男女

    一天不写程序难受
  • 数据称2016年新增2.6万区块链新项目,其中仅有8%还在活跃 |热点

    镁客网
  • 最新的“DNA联网”在物体中储存数据记忆

    瑞典苏黎世联邦大学(ETH Zurichat)的研究人员推出了一种将基因编码的数字数据混合到普​​通制造材料中的方法。他们与一位以色列科学家合作实施了该项目。

    shellmik
  • 现代科学增长率:一种潜在分段增长曲线法给新旧文献数据库的出版量建模(CS DL)

    科学的发展是科学研究中的一个普遍问题。近年来,两个新的文献数据库已被推出,可用于研究几个世纪以来科学的增长过程:Digital Science和Microsof...

    毛艺漩8078803
  • 在Entity Framework中重用现有的数据库连接字符串

    本文转载:http://www.cnblogs.com/dudu/archive/2011/01/29/entity_framework_connection_...

    跟着阿笨一起玩NET
  • 在Entity Framework中重用现有的数据库连接字符串

    Entity Framework使用的连接字符串与ADO.NET是不同的,见下图:

    跟着阿笨一起玩NET
  • ssm redis 数据字典在J2EE中的多种应用与实现

    数据字典在项目中是不可缺少的“基础设施”,关于数据字典如何设计如何实现,今天抽空讲一下吧 先看一下表设计: ? ? 通过自定义标签来实现页面的渲染: ? 再看...

    风间影月
  • 现阶段大数据环境中会存在什么样的不安全因素?

    之前分享过的大数据时代的到来,为我们提供了哪些便利之处?今天墨者安全为大家分享下,在现阶段的大数据环境中,会存在什么样的不安全因素?

    墨者安全筱娜
  • 连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识

    (1)学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强...

    点云PCL博主
  • 【DB笔试面试433】在Oracle 12c中,在数据泵(expdp)方面有哪些增强的新特性?

    (1)在Data Pump中引入了新的TRANSFORM的选项DISABLE_ARCHIVE_LOGGING,这对于表和索引在导入期间提供了关闭Redo日志生成...

    小麦苗DBA宝典
  • 本体技术视点 | 如何在区块链上实现数据等资源的交换?(二)

    上一期我们讲到建立于本体主链基础设施上的去中心化资源交换协议通用资源交易协议(Generic Resources Exchange Protocol,GREP)...

    本体Ontology
  • 本体技术视点 | 如何在区块链上实现数据等资源的交换?(一)

    通用资源交易协议(Generic Resources Exchange Protocol,GREP)是一套建立于本体主链基础设施上的去中心化资源交换协议。通过使...

    本体Ontology
  • GCN现有变体不完全汇总(在时空数据挖掘中的应用)

    MixHop: Higher-Order Graph Convolutional Architectures via Sparsified Neighborho...

    微风、掠过

扫码关注云+社区

领取腾讯云代金券