金仓数据库KingbaseES之自增列
关键字:自增列,sequence,serial,identity
KingbaseES中一共3种自增长类型sequence,serial,identity,他们的区别如下表:
对象 |
sequence | serial | identity |
显示插入 | 是 | 是 | 是 |
显示插入后更新最大值 | 否 | 否 | 否 |
清空表后是否重置 | 否 | 否 | 否 |
是否跟事务一起回滚 | 否 | 否 | 否 |
多对象共享 | 是 | 否 | 否 |
支持重置 | 是 | 是 | 是 |
出现错误后序列值是否增长 | 是 | 是 | 是 |
Sequence
测试用例:
create sequence seq_1 INCREMENT BY 1 MINVALUE 1 START WITH 1;create table test_seq(id int not null default nextval('seq_1') primary key,name varchar(10));
隐式插入:
insert into test_seq (name) values ('aaa');insert into test_seq (name) values ('bbb');insert into test_seq (name) values ('ccc');
显式插入:
insert into test_seq (id,name) values (5,'ddd');select * from test_seq;
查询结果
test1=# select * from test_seq;id | name----+------1 | aaa2 | bbb3 | ccc5 | ddd
再次隐式插入
--可以正常插入
insert into test_seq (name) values ('eee');
--插入失败,主键重复,因为序列自身是递增的,不会关心表中被显式插入的数据insert into test_seq (name) values ('fff');test1=# insert into test_seq (name) values ('eee');INSERT 0 1test1=# insert into test_seq (name) values ('fff');错误: 重复键违反唯一约束"test_seq_pkey"描述: 键值"(id)=(5)" 已经存在
--再次执行语句可正常插入,序列因为之前的错误调用自动增加test1=# insert into test_seq (name) values ('fff');INSERT 0 1test1=# select * from test_seq;id | name----+------1 | aaa2 | bbb3 | ccc5 | ddd4 | eee6 | fff
--重置序列的最大值select setval(' seq_1',(select max(id) from test_seq)::BIGINT);
--事务回滚后,序列号并不会回滚test1=# begin;BEGINtest1=# insert into test_seq (name) values ('ggg');INSERT 0 1test1=# rollback;ROLLBACKtest1=#test1=#test1=# select * from test_seq;id | name----+------1 | aaa2 | bbb3 | ccc5 | ddd4 | eee6 | fff(6 行记录)test1=# insert into test_seq (name) values ('ggg');INSERT 0 1test1=# select * from test_seq;id | name----+------1 | aaa2 | bbb3 | ccc5 | ddd4 | eee6 | fff8 | ggg(7 行记录)
-- truncate 表之后,序列不受影响test1=# truncate table test_seq;TRUNCATE TABLEtest1=# insert into test_seq (name) values ('ggg');INSERT 0 1test1=# select * from test_seq;id | name----+------9 | ggg(1 行记录)
--重置序列ALTER SEQUENCE seq_1 RESTART WITH 1;test1=# ALTER SEQUENCE seq_1 RESTART WITH 1;ALTER SEQUENCEtest1=# insert into test_seq (name) values ('ggg');INSERT 0 1test1=# select * from test_seq; id | name----+------9 | ggg1 | ggg
Serial
测试用例
create table test_serial(id serial primary key,name varchar(100));
隐式插入
insert into test_serial(name) values ('aaa');insert into test_serial(name) values ('bbb');insert into test_serial(name) values ('ccc');
显示插入
insert into test_serial(id,name) values (5,'ddd);select * from test_serial;
--再次隐式插入,第二次会报错insert into test_serial(name) values ('eee');insert into test_serial(name) values ('fff');test1=# insert into test_serial(id,name) values (5,'ddd);INSERT 0 1test1=# insert into test_serial(name) values ('eee');INSERT 0 1test1=# insert into test_serial(name) values ('fff');错误: 重复键违反唯一约束"test_serial_pkey"描述: 键值"(id)=(5)" 已经存在
--再次执行语句可正常插入,序列因为之前的错误调用自动增加test1=# insert into test_serial(name) values ('fff');INSERT 0 1test1=# select * from test_serial;id | name----+------1 | aaa2 | bbb3 | ccc5 | ddd4 | eee6 | fff(6 行记录)
--重置serialSELECT SETVAL((SELECT sys_get_serial_sequence(' test_serial', 'id')), 1, false);
Identity
Identity是R6版本新增的语法,R3数据库不支持该语法。
identity定义成generated by default as identity允许显式插入,
identity定义成always as identity 不允许显示插入,但是加上overriding system value也可以显式插入。
测试用例1:
create table test_identiy_1(id int generated always as identity (START WITH 1 INCREMENT BY 1) primary key ,name varchar(100));insert into test_identiy_1(name) values ('aaa');insert into test_identiy_1(name) values ('bbb');insert into test_identiy_1(name) values ('ccc');
显式插入值
如果定义为generated always as identity则不允许显式插入,除非增加overriding system value 提示。
insert into test_identiy_1(id,name) values (5,'ccc');insert into test_identiy_1(id,name)overriding system value values (5,'ccc');test1=# insert into test_identiy_1(id,name) values (5,'ccc');错误: 无法插入到列"id"描述: 列"id"是定义为GENERATED ALWAYS的标识列.提示: 使用OVERRIDING SYSTEM VALUE覆盖.test1=# insert into test_identiy_1(id,name)overriding system value values (5,'ccc');INSERT 0 1
测试用例2:
create table test_identiy_2(id int generated by default as identity (START WITH 1 INCREMENT BY 1) primary key ,name varchar(100));insert into test_identiy_2(name) values ('aaa');insert into test_identiy_2(name) values ('bbb');insert into test_identiy_2(name) values ('ccc');test1=# insert into test_identiy_2(id,name) values (5,'ccc');INSERT 0 1
重置Identity的方式有2种:
--方式1:
ALTER TABLE test_identiy_1 ALTER COLUMN id RESTART WITH 100;
--方式2:
TRUNCATE table test_identiy_1 RESTART IDENTITY;
金仓数据库KingbaseES之自增列相关推荐
- 解决金仓数据库KingbaseES创建serial列并将其设置为主键约束,同时copy两条及以上数据时报错的问题
关键字 人大金仓.金仓数据库.KingbaseES.KES.serial.copy.PRIMARY KEY 问题描述 使用KingbaseES V8R3数据库的客户端工具ksql执行copy - ...
- 金仓数据库KingbaseES行列转换
概述 行列转换是在数据分析中经常用到的一项功能,金仓数据库KingbaseES从V8R6C3B0071版本开始通过扩展插件(kdb_utils_function)支持pivot和unpivot功能.在 ...
- 金仓数据库KingbaseES表空间(tablespace)知多少
金仓数据库KingbaseES表空间定义 金仓数据库KingbaseES中的表空间允许在文件系统里定义那些代表数据库对象的文件存放位置,比如表和索引等.一旦表空间被创建,那么就可以在创建数据库对象时通 ...
- 如何在金仓数据库KingbaseES中使用pg_get_function_arg_default函数
关键字 pg_get_function_arg_default,regproc 问题描述 如何在金仓数据库KingbaseES中使用pg_get_function_arg_default函数获取函数或 ...
- 金仓数据库KingbaseES序列的操作
关键字 kingbase,序列 问题描述 如何操作金仓数据库KingbaseES序列? 解决方案 1.创建一个新的序列数发生器. 创建一个称作serial的上升序列,从 101 开始: CREATE ...
- 金仓数据库KingbaseES函数的管理
关键字 kingbase,函数 问题描述 如何管理金仓数据库KingbaseES函数? 解决方案 a.创建一个函数 create or repalce function CREATE FUNCTION ...
- 金仓数据库KingbaseES模式的使用
关键字 Kingbase.模式 正文 金仓数据库KingbaseES模式使用注意事项: 多个用户使用同一个数据库而不会相互影响: 对数据库中的对象进行逻辑分组,更便于管理: 各个应用分别使用各自的 ...
- 金仓数据库KingbaseES ORACLE_FDW常见问题
1. OCIEnvCreate错误 错误信息:error:error connecting to Oracle: OCIEnvCreate failed to create environmen ...
- 如何在金仓数据库KingbaseES中指定IP登录
关键字 KingbaseES,指定IP 问题描述 如何在金仓数据库KingbaseES中指定IP登录? 解决方案 1. 修改data目录下sys_hba.conf文件 2. 进行IP修改,重启服务,在 ...
- 金仓数据库KingBaseES V7安装指南
1.按照教程操作 下载和系统符合的软件,解压,找到setup文件,点击install.exe (1)语言选择,默认汉语,想使用英语的可以自行选择 要选择完全安装 (2)检查依赖项 如果是这样的界面就不 ...
最新文章
- R语言ggplot2可视化自定义可视化结果的背景色(background color)实战:改变整个画板(panel)的背景色、改变图像(plot)区域的背景色
- Flutter Web 应用程序的 URL 中删除前导`#`
- MySQL查询出2门及2门以上不及格者的平均成绩
- gulp es5语法转换及js/css/html压缩过程
- java高性能阻塞队列,Linux c/c 后台开发组建之:高性能阻塞队列
- java同名函数_浅谈Java 继承接口同名函数问题
- layer.open组件获取弹出层页面变量、函数
- weka分类器怎么设置类别_AI 迁移学习怎么玩?手把手教你实战迁移学习
- 不属于处理数据的计算机应用,计算机应用基础6
- dojo——AMD(一、AMD中class使用)
- java 中文分词转拼音_如何实现拼音与汉字的互相转换
- 软件测试技术---单元测试和集成测试
- [历朝通俗演义-蔡东藩-前汉]第007回 寻生路徐市垦荒 从逆谋李斯矫诏
- Typora文字变红
- 服务器固态硬盘raid0,SSD固态硬盘,撸一把RAID0模式大提速
- 打造高速浏览器,逐鹿搜索市场,搜狗高速浏览器2.0值得期待
- iOS开发——单元测试
- 项目开发团队分配管理软件
- php 上标和下标,css如何显示文字的上标和下标
- iOS开发日记54-Xcode7调试神技
热门文章
- 这三种研发工程师千万不能招?
- response.addCookie(cookie);报错分析
- linux 时间 time(2)-频率(时钟周期/指令周期/CPU周期)和 jiffies
- 服务器删除的文件不在回收站,删除的文件不在回收站如何恢复?新方法来了
- 京东后台:订单履约系统设计(下)
- Cookie 的 SameSite 属性
- 科技论文写作经验之谈
- qemuuser模式运行linux,qemu两种上网方式
- 在QT界面中使用ico/png等图片文件,生成exe后不依赖外部文件
- php关闭notice_php怎么关闭notice警告