1. 序列概述
数据库序列是一种用于生成唯一数字值的对象,通常用于生成表中的主键值或其它需要唯一标识符的列的值。序列是数据库中的一种独立对象,可以在表的任何地方使用,
以生成唯一的,递增或递减的数值序列,序列是用户创建的数据库对象,序列会产生唯一的整数。
2. 创建序列
创建序列的两种方式
(1)使用create sequence显示创建一个序列
(2)为表列指定为serial的数据类型时,KES自动隐式创建一个序列,且与该列绑定。
隐式创建的序列默认的命名规则为"表名_列名_seq"
超级用户或具有模式上create 权限的用户才能在该模式中创建序列。
3. 序列操作
CREATE SEQUENCE "public"."my_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999 START 1 CACHE 20 NO CYCLE; |
CREATE TABLE "public"."expect_value" ( "id" serial NOT NULL, "name" varchar NOT NULL, "value" text NOT NULL, "creator" character varying(64 char) NULL, "create_time" date NOT NULL, "updater" character varying(64 char) NULL, "update_time" date NOT NULL, "deleted" numeric(1,0) NOT NULL DEFAULT 0 ); |
# 使用命令行来查看序列 tw=# \ds my_seq; 关联列表 架构模式 | 名称 | 类型 | 拥有者 ----------+--------+--------+-------- public | my_seq | 序列数 | system (1 行记录) # 查看数据字典 tw=# select * from user_sequences where sequence_name = 'my_seq'; SEQUENCE_OWNER | SEQUENCE_NAME | MIN_VALUE | MAX_VALUE | INCREMENT_BY | CYCLE_FLAG | ORDER_FLAG | CACHE_SIZE | LAST_NUMBER ----------------+---------------+-----------+------------+--------------+------------+------------+------------+------------- system | MY_SEQ | 1 | 9999999999 | 1 | N | Y | 20 | (1 行记录) tw=# select * from my_seq; last_value | log_cnt | is_called ------------+---------+----------- 1 | 0 | f (1 行记录) |
修改序列的起始值和步长
alter sequence my_seq start with 1000 increment by 10; |
序列的初始值只会影响该序列首次被使用时的取值起点。
修改已经被使用过的序列的初始值,不会影响序列后序生成值的变化。
如果是一个可循环的序列,序列到达边界值时会从另一个边界值开始进行下一次循环。
# 查看序列的当前值 select currval('my_seq'); nextval --------- 1 (1 行记录) # 查看序列的下一个值 tw=# select nextval('my_seq'); nextval --------- 11 (1 行记录) # 重置序列的值 tw=# select setval('my_seq',200); setval -------- 200 (1 行记录) # 查看序列的当前值 tw=# select nextval('my_seq'); nextval --------- 220 (1 行记录) |
tw=# drop sequence my_seq; DROP SEQUENCE |
tw=# drop sequence expect_value_id_seq; 错误: 无法删除 序列 expect_value_id_seq 因为有其它对象倚赖它 描述: 表 expect_value的列id的缺省值 倚赖于 序列 expect_value_id_seq 提示: 使用 DROP .. CASCADE 把倚赖对象一并删除. tw=# drop sequence expect_value_id_seq cascade; 注意: 递归删除 表 expect_value的列id的缺省值 DROP SEQUENCE |