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处开始再次循环。