PostgreSQL serial类型

serial类型和序列

postgresql序列号(SERIAL)类型包括

  • smallserial(smallint,short),
  • serial(int)
  • bigserial(bigint,long long int)

不管是smallserial,serial还是bigserial,其范围都是(1,9223372036854775807),但是序列号类型其实不是真正的类型,当声明一个字段为序列号类型时其实是创建了一个序列,INSERT时如果没有给该字段赋值会默认获取对应序列的下一个值。

操作

建表的时添加序列

sql 复制代码
create table tbl_serial(a serial,b varchar(2));

单独创建序列再使用

sql 复制代码
 create sequence sql_tbl_serial2_a 
increment by 1 
minvalue 1 
no maxvalue 
start with 1;


create table tbl_serial2(
    a int not null default nextval('sql_tbl_serial2_a'),
    b varchar(2)
);

创建序列

sql 复制代码
Syntax:
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]

INCREMENT BY : 每次序列增加(或减少)的步长

MINVALUE : 序列最小值,NO MINVALUE表示没有最小值

MAXVALUE : 序列最大值,NO MAXVALUE表示没有最大值

START WITH :以什么序列值开始

CYCLE : 序列是否循环使用

OWNED BY : 可以直接指定一个表的字段,也可以不指定。

需要改序列

text 复制代码
Syntax:
ALTER SEQUENCE [ IF EXISTS ] name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]

序列涉及的函数有

函 数 返 回 类 型 描 述
currval( regclass ) bigint 获取指定序列最近一次使用netxval后的数值,如果没有使用nextval而直接使用currval会出错。
lastval() bigint 返回最近一次用 nextval 获取的任意序列的数值
nextval( regclass ) bigint 递增序列并返回新值
setval( regclass,bigint ) bigint 设置序列的当前数值
setval( regclass,bigint ,boolean ) bigint 设置序列的当前数值以及 is_called 标志,如果为true则立即生效,如果为false,则调用一次nextval后才会生效。

重命名

我有一个名为pivot_device_user的表,它的ID为not null default nextval('pivot_device_user_id_seq'::regclass)。在Postgres中重命名为nextval('...')

然后我决定将我的表重命名为pivot_box_user,但nextval(...)仍然是nextval('pivot_device_user_id_seq'::regclass)。我想将它更改为nextval('pivot_box_user_id_seq'::regclass)。

如果您重命名序列,则其OID保持不变。因此,所有你需要做的是rename the sequence:

sql 复制代码
ALTER SEQUENCE pivot_device_user_id_seq RENAME TO pivot_box_user_id_seq; 

查询当前序列值

sql 复制代码
SELECT currval('sequence_name'::regclass);

使用当前序列值,下个序列值递增

sql 复制代码
SELECT nextval('sequence_name'::regclass);

问题

如果一个序列是NO CYCLE,当序列值全部使用完会怎样呢?

如果序列值用完了当然是错误了!!!如果是CYCLE则会重新从START处开始再次循环。

相关推荐
bang___bang_2 小时前
PostgreSQL内幕剖析——结构与架构
数据库·postgresql
yuanpan8 小时前
MongoDB与PostgreSQL两个数据库的特点详细对比
数据库·mongodb·postgresql
zxrhhm1 天前
Oracle 中的虚拟列Virtual Columns和PostgreSQL Generated Columns生成列
postgresql·oracle·vr
懒大王爱吃狼1 天前
怎么使用python进行PostgreSQL 数据库连接?
数据库·python·postgresql
文牧之2 天前
PostgreSQL 配置设置函数
运维·数据库·postgresql
文牧之2 天前
AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比
运维·数据库·postgresql·oracle
檀越剑指大厂3 天前
【PostgreSQL系列】PostgreSQL性能优化
数据库·postgresql·性能优化
kngines3 天前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-D. 扩展插件列表(PostGIS/PostgREST等)
数据库·postgresql·数据分析·pgvector·扩展插件·postgrest·向量数据
chennalC#c.h.JA Ptho4 天前
kubuntu系统详解
linux·数据库·经验分享·postgresql·系统安全
kngines4 天前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.4 模型部署与定期评估
postgresql·数据分析·存储过程·jsonb·pg_cron·ks值·影子测试机制