在KingbaseES中create table语句支持GENERATED column(生成列)。

生成列是一种特别的列类型,它的值基于其他列的值计算得出。因此,生成列之于列,有点像视图之于表的关系。存在两种类型的生成列:存储生成列和虚拟生成列。

存储生成列在数据被写入(插入或更新操作)时进行计算,并且像常规列那样,它们在存储上占据空间。相比之下,虚拟生成列并不占用存储空间,它们的值是在被读取时才计算出来的。从这个角度看,虚拟生成列与视图相似,而存储生成列则类似于物化视图,不同之处在于它们总是自动更新。目前,KingbaseES只支持存储生成列。要创建一个生成列,可以在 CREATE TABLE 语句中使用 GENERATED ALWAYS AS 子句。

例如:

test=# CREATE TABLE score("姓名" varchar(20),"语文" int, "数学" int, "英语" int, "总分" int GENERATED ALWAYS AS ("语文"+"数学"+"英语") STORED);
CREATE TABLE
test=# \d score
数据表 "public.score"
栏位 | 类型 | 校对规则 | 可空的 | 预设
------+----------------------------+----------+--------+-------------------------------------------------------
姓名 | character varying(20 char) | | |
语文 | integer | | |
数学 | integer | | |
英语 | integer | | |
总分 | integer | | | generated always as ("语文" + "数学" + "英语") stored test=# insert into score values ('小明',89,99,99);
INSERT 0 1
test=# select * from score ;
姓名 | 语文 | 数学 | 英语 | 总分
------+------+------+------+------
小明 | 89 | 99 | 99 | 287
(1 行记录) test=# insert into score values ('小明',89,99,99,287);
错误: 无法插入到列"总分"
描述: 列"总分"是生成的列. test=# CREATE TABLE score("姓名" varchar(20),"语文" int, "数学" int, "英语" int, "总分" int GENERATED ALWAYS AS ("语文"+"数学"+"英语") STORED) partition by range ("总分");
错误: 无法在分区键中使用生成的列
第1行... ("语文"+"数学"+"英语") STORED) partition by range ("总分"); ^
描述: 列"总分"是生成的列.

需要注意的是,生成列不能直接接收插入或更新的值。

尽管在 INSERT 或 UPDATE 命令中不能为生成列指定具体的值,使用 DEFAULT 关键字仍然是可行的。

理解列的默认值与生成列之间的区别是重要的:默认值只在行首次插入时计算一次,而生成列则在每次行变动时更新,并且无法被其他值取代。

列的默认值不能引用表中的其他列,而生成列通常会这样做。默认值可以使用易变函数,如random()或当前时间函数,但生成列则不允许这样做。

生成列和包含生成列的表定义还有一些限制:

  • 生成表达式只能使用不可变函数,不能使用子查询,也不能以任何方式引用当前行以外的内容
  • 生成表达式不能引用另一个生成列或系统表(除了 tableoid)
  • 生成列不能设置列默认值或标识定义,也不能作为分区键的一部分
  • 外部表可以包含生成列
  • 不能基于其他生成列定义一个新的生成列

使用生成列时的其他注意事项包括:

生成列具有与其底层基础列不同的访问权限。因此可以设置权限,以便特定角色只能从生成列读取数据,而不是从底层基础列。

从概念上讲,生成列在BEFORE触发器执行后更新,因此 BEFORE 触发器中对基础列所做的更改将反映在生成列中。然而,反过来,在BEFORE触发器中不能访问生成列。

KingbaseES自动生成列介绍的更多相关文章

  1. Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍

    Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...

  2. c# DataGridView在使用DataSource时,只显示指定的列或禁止自动生成列

    可通过设置DataGridView控件的AutoGenerateColumns属性来处理. //禁止自动生成列,以下场景会用到:数据源的列超过需要展示的列 this.gridDevice.AutoGe ...

  3. wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序

    环境Win10 VS2019 .Net Framework4.8 在wpf中,如果为一个DataGrid绑定到一个数据源,默认情况下DataGrid会为数据源类型的每个属性生成一个列(Column)对 ...

  4. 如何不让DataGridView自动生成列

    如果不想让DataGridView自动生成与数据源对应的列, 只需要把属性AutoGenerateColumns设为false即可. 需要注意: 在界面设计的属性窗口中是看不到AutoGenerate ...

  5. GNU autotools自动生成Makefile 介绍

    一.目的 使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用"./configure", "ma ...

  6. 【转】如何不让DataGridView自动生成列

    源地址:https://www.cnblogs.com/hailexuexi/p/3983856.html

  7. WPF DataGrid自动生成列

    <Window x:Class="DataGridExam.MainWindow"        xmlns="http://schemas.microsoft.c ...

  8. c# datagridview禁止自动生成额外列

    在某些时候,处于重用pojo的考虑,我们希望在不同的datagridview之间进行复用,这就涉及到pojo中的字段会比有些datagridview所需要的字段多,默认情况下,.net对于pojo中的 ...

  9. 设置DataGridView不自动创建生成列

    DataGridView.AutoGenerateColumns 获取或设置一个值,该值指示是否为数据源中的每一字段自动创建 BoundColumn 对象并在 DataGrid 控件中显示这些对象. ...

  10. 转载:mybatis自动生成

    MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://generator.sturgeon.mopaas.com/ 该中文文档由于尽可能和原文内容 ...

随机推荐

  1. Js捕获异常的方法

    Js捕获异常的方法 JavaScript的异常主要使用try catch finally语句以及窗口对象window的onerror事件来捕获. try catch finally try catch ...

  2. 《系列二》-- 7、后置处理器-PostProcessor

    目录 什么是后置处理器 spring 源码中已知的,顶级PostProcessor 其它 "后置处理器" 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主 ...

  3. SpringBoot整合EasyExcel实现Excel表格的导出功能

    前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 在后端管理系统的开发中,经常有导出当前表格数 ...

  4. postgresql中的json和jsonb

    1. 简介postgresql9.3以后,我们可以将表的字段类型设置为json.同时,postgresql还提供了jsonb格式,jsonb是json的二进制形式.二者区别: postgresql9. ...

  5. 游戏H5引擎Canvas屏幕自适应CSS代码

    canvas.style = `touch-action: none; width:${ width }px; height:${ height }px; cursor: inherit;`;

  6. .NET 全能 Cron 表达式解析库(支持 Cron 所有特性)

    前言 今天大姚给大家分享一个.NET 全能 Cron 表达式解析类库,支持 Cron 所有特性:TimeCrontab. Cron表达式介绍 Cron表达式是一种用于配置定时任务的时间表达式.它由一系 ...

  7. 想做大模型开发前,先来了解一下MoE

    为了实现大模型的高效训练和推理,混合专家模型MoE便横空出世. 大模型发展即将进入下一阶段但目前仍面临众多难题.为满足与日俱增的实际需求,大模型参数会越来越大,数据集类型越来越多,从而导致训练难度大增 ...

  8. Codeforces Round 787 (Div. 3)D. Vertical Paths

    题目链接 题意:给定一棵树,将这棵树划分成几天互不相交的链,要求最小化链的数量 思路:每个叶子节点一定在一条链中,所以链的数量就是叶子节点的数量,从叶子节点往上跳直到根节点,边跳边标记,路径上所有点都 ...

  9. git 取消代理无效?试试这个

    git 取消代理的命令操作 git conifg --global --unset http.proxy git conifg --global --unset https.proxy 一般情况下这种 ...

  10. python中往json中添加文件的方法

    一 前言: python中常用的一种方式,这里给大家列出来一下. 二 实例 比如,最简单的一个json文件 test_json = { "a": 1, "b": ...