PG序列

序列

序列介绍

PG与Oracle一样有单独的序列,不像MySQL其序列是绑定在一张表的字段上的

MySQL的序列有如下限制:(PG没有此限制)

*自增长只能用于表中的其中一个字段

*自增长只能分配给固定表的某一固定的字段,不能被多个表公用

 

序列创建

CREATE [ TEMPORARY | TEMP ] SEQUENCE 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 } ]

参数说明

*temporary或temp:创建只存在于这个会话中的临时序列,会话结束时该序列会自动删除。创建出的临时序列,除非用模式(schema)修饰,否则同一个会话中同名的非临时序列是不可见的

*increment [BY] increment:指定序列的步长,正数产生一个递增的序列,负数产生一个递减的序列。默认值为1

*minvalue minvalue|no minvalue:指定序列的最小值,对于递增序列,最小值默认为1;对于递减序列,最小值默认为-2^63-1。no minvalue相当于使用默认值

*maxvalue maxvalue|no maxvalue:指定序列的最大值,对于递增序列,最大值为2^63-1;对于递减序列,最大值默认为-1。no maxvalue相当于使用默认值

*start [with] start:指定开始的起点值

*[cache cache]:指定cache的数值。最小值(也是默认值)是1,表示一次只能生成一个值,也就是说没有缓存

*[NO] CYCLE:在序列达到maxvalue或minvalue时cycle选项可使循环继续下去。也就是说如果达到极限,生成的下一个数据将分别是minvalue或maxvalue。如果声明了no cycle,那么在序列达到最大值后,任何对nextval的调用都将返回一个错误。如果既没有声明cycle也没有声明no cycle,那么默认是no cycle

*owned by {table.column|NONE}:owned by选项用于将序列关联到一个特定的表字段上。这样,在删除那个字段或其所在的表时将自动删除绑定的序列。指定的表和序列必须被同一个用户所拥有,并且在同一个模式中。默认的owned by none表示无关联

 

序列的使用及相关函数

PG通过一些全局函数来使用序列

*nextval函数参数是regclass,输入的是一个字符串,regclass类型会自动把字符串转成regclass类型

*currval函数可以返回最近一次使用nextval获得的指定序列的数值,调用currval函数之前,一般都需要执行过nextval函数

*lastval函数与currval函数不同的是,不管最后调用的是哪个序列,总返回最后一次调用nextval函数的值

*setval函数能够改变序列的当前值,若之后再调用nextval函数,返回的值将会变成改变后的当前值+1。两个参数形式的setval函数相当于把第三个参数设置为true,即将is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。如果在3个参数形式的setval函数里,is_called设置为false,那么下一次nextval将返回声明的数值,只有再次调用nextval才开始递增该序列

 

注意

1、在事务中使用序列,事务回滚后,序列不会回滚

2、序列是基于bigint运算的,因此其范围不能超过8字节的整数范围(-9223372036854775808到9223372036854775807)。一些古老的平台不支持8字节整数的编译器,这种情况下序列是普通的integer运算范围(-2147483648到+2147483647)

3、cache子句中,如果cache大于1,并且这个序列对象将被用于多会话并发的场合,那么每个会话在每次访问序列对象的过程中都将分配并缓存随后的序列值,并且相应地增加序列对象的last_value。这样,同一个事务中随后的cache-1次nextval将只返回预分配的数值。因此所有在会话中分配了却没有使用的数字都将在会话结束时丢失,从而导致序列里出现“空洞”。尽管系统保证为多个会话分配独立的序列值,但是如果考虑了所有会话,这个数值可能会是无序的。

4、当序列满了,默认不加“cycle”选项,创建出来的序列满时会报错,而如果加了“cycle”选项,序列会从开始值重新开始

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值