文档章节

【PG内核】pg11秒级新增非空默认字段的实现方法

movead
 movead
发布于 01/21 09:22
字数 654
阅读 15
收藏 0

pg11新特性,可以瞬间向一个表中添加非空默认字段。

今天研究了一下这个特性的内核实现方式,写个博客简单记录一下。

 

结论奉上

pg在从硬盘或者内存获取到一条数据记录后(以下称tuple),会使用

heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,Datum *values, bool *isnull)

函数把这个tuple根据其所在表的表结构(tupleDesc)进行"肢解",肢解结果放到values数组里。

也就是说values数组里的每一个元素对应着一个字段的值。isnull也是一个数组,这个数组记录着

对应的字段是否有值。

 

在pg11中heap_deform_tuple()函数增加了一段代码

for (; attnum < tdesc_natts; attnum++)
		values[attnum] = getmissingattr(tupleDesc, attnum + 1, &isnull[attnum]);

用于对values为空但是有缺失默认值的字段追加赋值。

(只对增加列时就制定了默认值的字段有效,先增加列后指定默认值的无效)

这样增加字段的之前tuple的数据没有任何改动的情况下,就可以查询出默认值。

 

系统表的改变

postgres=# \d pg_attribute
              Table "pg_catalog.pg_attribute"
    Column     |   Type    | Collation | Nullable | Default 
---------------+-----------+-----------+----------+---------
 attrelid      | oid       |           | not null | 
 attname       | name      |           | not null | 
 atttypid      | oid       |           | not null | 
 attstattarget | integer   |           | not null | 
 attlen        | smallint  |           | not null | 
 attnum        | smallint  |           | not null | 
 attndims      | integer   |           | not null | 
 attcacheoff   | integer   |           | not null | 
 atttypmod     | integer   |           | not null | 
 attbyval      | boolean   |           | not null | 
 attstorage    | "char"    |           | not null | 
 attalign      | "char"    |           | not null | 
 attnotnull    | boolean   |           | not null | 
 atthasdef     | boolean   |           | not null | 
 atthasmissing | boolean   |           | not null | 
 attidentity   | "char"    |           | not null | 
 attisdropped  | boolean   |           | not null | 
 attislocal    | boolean   |           | not null | 
 attinhcount   | integer   |           | not null | 
 attcollation  | oid       |           | not null | 
 attacl        | aclitem[] |           |          | 
 attoptions    | text[]    |           |          | 
 attfdwoptions | text[]    |           |          | 
 attmissingval | anyarray  |           |          | 
Indexes:
    "pg_attribute_relid_attnam_index" UNIQUE, btree (attrelid, attname)
    "pg_attribute_relid_attnum_index" UNIQUE, btree (attrelid, attnum)

postgres=# 

系统表pg_attribute中增加了atthasmissing和attmissingval字段。

atthasmissing:这个字段是否有缺失默认值

attmissingval:缺失默认值,getmissingattr()函数获取的值的来源就是这里。

增加一个有默认值的字段时这个字段的atthasmissing设置为true,attmissingval设置为默认值。

注意:当修改某个字段的默认值时,只会修改pg_attrdef系统表里的默认值,不会修改pg_attribute表里的默认值

也就是说,增加列之后缺失默认值的值不会再发生改变。如果你在增加列时未指定默认值,那么这个列的值永远不

会自动填充。

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
movead
粉丝 10
博文 19
码字总数 26248
作品 0
济南
高级程序员
私信 提问
MySQL(十五)DDL之常见的约束

一、常见的约束 NOT NULL:非空,该字段的值必填 UNIQUE:唯一,该字段的值不可重复 DEFAULT:默认,该字段的值不用手动插入有默认值 PRIMARY KEY:主键,该字段的值不可重复并且非空 unique...

leeqico
2018/05/29
0
0
新增非空约束字段在不同版本中的演进

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

bisal
2016/11/20
0
0
Mybatis-Plus 1.4.5 发布,支持 mybatis 热加载等

Mybatis-Plus 1.4.5 发布了。 支持 mybatis mapper.xml 单个方法修改热加载,支持公共字段自定义填充功能。数据库关键词转义等!!! Mybatis-Plus 是一款 MyBatis 的增强工具包,简化 CURD...

青苗
2016/08/29
4.9K
7
synchronized/treetable-lay

treetable-lay  实现layui的树形表格treeTable 1.简介  在layui数据表格之上进行扩展实现。 演示地址:https://whvse.gitee.io/treetable-lay/  还有一个BOM表结构的树形表格,树形表格2...

synchronized
2018/07/28
0
0
Redkale 1.9.0 发布,Java 分布式微服务

Redkale, 一个教科书级的框架,一个全新,完全颠覆传统思维的Java分布式服务架构,1M的jar可以代替传统几十M的第三方。包含TCP/UDP、HTTP、RPC、依赖注入、序列化与反序列化、数据库操作、W...

Redkale
2018/03/01
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

CDH5之时钟偏差问题

CDH5之时钟偏差问题 一、介绍 主机时钟偏差的问题,是分布式中各个主机之间存在系统时差,或者和ntp服务器的时间不同步造成的。如果集群之中没有配置ntp服务,那么时钟偏差会非常频繁,如下图...

星汉
7分钟前
0
0
ArrayBlockingQueue 与 LinkedBlockingDeque 的内部实现

区别 类似于ArrayList 与 LinkedList 的区别,ArrayBlockingQueue 与 ArrayList 的内部存储结构为数组;而LinkedBlockingDeque 与 LinkedList 的内存存储结构是一个双向链表的存储(所以两者...

noob_fly
8分钟前
0
0
巨杉数据库中标广州银行影像内容管理平台项目

近期,巨杉数据库中标广州银行影像内容管理平台项目,助推广州银行智慧业务升级。 随着银行在智慧化转型的不断发展,影像、音视频甚至用户生物特征信息等非结构化数据在银行数据管理中的比重...

巨杉数据库
11分钟前
0
0
网络社交如何保护个人隐私?做好这4步

在这个全民社交时代,互联网成为了我们生活最主要的娱乐方式,但也让我们的“一举一动”变得有迹可寻。比如,在微博上发布的动态、评论、定位以及第三方应用的授权等操作,都在不经意间将个人...

ThinkSNS官方帐号
12分钟前
0
0
CentOS 编译安装的软件卸载方法

之前在源码包的位置执行的 make install 现在就是反过来 执行make uninstall 本人微信: 本人QQ:

lwkai
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部