KingbaseES自动生成列介绍
在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自动生成列介绍的更多相关文章
- Bootstrap Blazor 组件介绍 Table (一)自动生成列功能介绍
Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...
- c# DataGridView在使用DataSource时,只显示指定的列或禁止自动生成列
可通过设置DataGridView控件的AutoGenerateColumns属性来处理. //禁止自动生成列,以下场景会用到:数据源的列超过需要展示的列 this.gridDevice.AutoGe ...
- wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序
环境Win10 VS2019 .Net Framework4.8 在wpf中,如果为一个DataGrid绑定到一个数据源,默认情况下DataGrid会为数据源类型的每个属性生成一个列(Column)对 ...
- 如何不让DataGridView自动生成列
如果不想让DataGridView自动生成与数据源对应的列, 只需要把属性AutoGenerateColumns设为false即可. 需要注意: 在界面设计的属性窗口中是看不到AutoGenerate ...
- GNU autotools自动生成Makefile 介绍
一.目的 使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用"./configure", "ma ...
- 【转】如何不让DataGridView自动生成列
源地址:https://www.cnblogs.com/hailexuexi/p/3983856.html
- WPF DataGrid自动生成列
<Window x:Class="DataGridExam.MainWindow" xmlns="http://schemas.microsoft.c ...
- c# datagridview禁止自动生成额外列
在某些时候,处于重用pojo的考虑,我们希望在不同的datagridview之间进行复用,这就涉及到pojo中的字段会比有些datagridview所需要的字段多,默认情况下,.net对于pojo中的 ...
- 设置DataGridView不自动创建生成列
DataGridView.AutoGenerateColumns 获取或设置一个值,该值指示是否为数据源中的每一字段自动创建 BoundColumn 对象并在 DataGrid 控件中显示这些对象. ...
- 转载:mybatis自动生成
MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://generator.sturgeon.mopaas.com/ 该中文文档由于尽可能和原文内容 ...
随机推荐
- Java网络编程之使用URL类
Lesson: Working with URLs 使用URLs 整理自Oracle官方文档. URL is the acronym for Uniform Resource Locator. URL ...
- Java并发编程实例--4.控制线程打断
Java提供了InterruptedException异常,当我们检测到线程被打断时可以抛出并在run()方法中进行捕捉. 本例中,我们将开发一个程序以实现根据文件名称在指定文件夹(包括其子目录)中搜 ...
- Kafka集群搭建与SpringBoot项目集成
本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群,以及怎么在SpringBoot项目中使用Kafka. kafka集群环境包地址:https://pan.baidu.com/s/1Mar ...
- 【Android逆向】frida hook so 函数
1. apk来自52pojie 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 2.apktool反编译apk,拿到so文件 ja ...
- go语言编程常见问题
在Goland中运行单元测试报错Error: Cannot find package 如下图,在Goland中运行单元测试时报错:"Error: Cannot find package&qu ...
- Windows Docker Destop修改默认镜像文件位置
0.首先关闭docker destop. 1.通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径 2.我的路径:C:\Users\Administ ...
- django中如何处理事务
生成订单时,一次性生成多条数据记录或者一次性操作多个模型,都有可能产生中途报错的情况,所以需要在生成订单时保证多个数据操作的原子性. 事务 在完成一个整体功能时,操作到了多个表数据,或者同一个表的多条 ...
- flask操作mongodb
一个简单的注册登录 from pymongo import MongoClient MC = MongoClient('127.0.0.1', 27017) MongoDB = MC['s2'] #创 ...
- FROM_UNIXTIME函数格式化时间戳日期类型
select FROM_UNIXTIME(bce.daysec_time/1000,'%Y-%m-%d %h:%i:%s') ,bce.* from biz_cvent bce where bce.d ...
- mysql-批量修改表的主键id,修改成联合主键
1.sql脚本 一. 通过sql脚本,查出所有表的功能,并编写插入修改的联合主键,sql select concat('ALTER table ', TABLE_NAME, ' DROP PRIMAR ...