postgresql:序列
序列
序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。
创建序列
increment by : 每次序列增加(或减少)的步长
minvalue: 序列最小值,NO MINVALUE表示没有最小值
maxvalue : 序列最大值,NO MAXVALUE表示没有最大值
start with :以什么序列值开始
cycle : 序列是否循环使用
owned by : 可以直接指定一个表的字段,也可以不指定
法一:先创建序列,然后在新建的表中列属性指定序列
//创建序列
create sequence stulyd_id_seq
increment by 1
minvalue 1
no maxvalue
start with 1;
//创建表
create table stulyd(
id int4 not null default nextval('stulyp_id_seq'), //default 设置默认值
name varchar(40));
法二:直接在表中指定字段类型为serial
当声明一个字段为序列号类型时其实是创建了一个序列,该序列名为 表名_字段名_seq
create table stulyd(
id serial,
name varchar(40));
在insert命令中使用序列
insert into stulyd values(nextval('stulyd_id_seq'),'Mike');
查看下一个序列值(返回该序列的下一个数值)
select nextval('stulyd_id_seq');
查看序列最近使用值(在当前会话中返回最近一次nextval抓到的该序列的数值)
如果当前会话在该序列上从未调用过nextval则会报错
select currval('stulyd_id_seq');
返回当前会话中最近一次nextval返回的数值(不以序列名为参数)
如果当前会话从未调用过nextval则会报错
select lastval();
? 当前会话 ?其他会话?
重置序列值
法一:
select setval('stulyd_id_seq',5); //下一个序列值为6
select setval('stulyd_id_seq',5,false); //下一个序列值为5
select setval('stulyp_id_seq',max(id)) from stulyp;
法二:
alter sequence stulyd_id_seq restart with 5; //下一个序列值为5
修改序列
alter sequence stulyd_id_seq increment by 2; //修改步长
alter sequence stulyd_id_seq maxvalue 12; //修改最大值
删除序列
drop sequence stulyd_id_seq; //提示序列正在被使用
//先删除表,再删除序列
drop table stulyd;
drop sequence stulyd_id_seq;