加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL 序列(SEQUENCE)

发布时间:2020-12-13 18:19:34 所属栏目:百科 来源:网络整理
导读:一、简介 序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。 二、创建序列 方法一: 直接在表中指定字段类型为serial 类型 david = # create table tbl_xulie (david(# id serial,dav

一、简介

序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。

二、创建序列

方法一:直接在表中指定字段类型为serial 类型

david=# create table tbl_xulie (
david(# id serial,david(# name text);
NOTICE:  CREATE TABLE will create implicit sequence "tbl_xulie_id_seq" for serial column "tbl_xulie.id"
TABLE
david=#

方法二:先创建序列名称,然后在新建的表中列属性指定序列就可以了,该列需int 类型

创建序列的语法:

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.column | NONE } ]

实例:

create sequence tbl_xulie2_id_seq increment by 1 minvalue 1 no maxvalue start with 1; CREATE SEQUENCE david=#
tbl_xulie2 ( david(# id int4 not null default nextval('tbl_xulie2_id_seq'),0)">); =#

三、查看序列

david=# d tbl_xulie
                         Table "public.tbl_xulie"
 Column |  Type   |                       Modifiers                        
--------+---------+--------------------------------------------------------
 id     | integer | tbl_xulie_id_seq::regclass)
 name   text     

david# d tbl_xulie2
                         .tbl_xulie2"
                         Modifiers                        
------+---------+---------------------------------------------------------
 id     =#

查看序列属性

# d tbl_xulie_id_seq Sequence ".tbl_xulie_id_seq" Column Value -------------+---------+--------------------- sequence_name | name tbl_xulie_id_seq last_value bigint start_value increment_by max_value 9223372036854775807 min_value cache_value log_cnt 0 is_cycled | boolean f is_called f Owned by: .tbl_xulie.id david
select * from tbl_xulie2_id_seq; sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled is_called -----------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- tbl_xulie2_id_seq | 1 | | 9223372036854775807 | | 0 | f f ( row) david=#
四、序列应用

4.1 在INSERT 命令中使用序列

insert into tbl_xulie values (nextval('),David); INSERT Sandy tbl_xulie; id name --+------- David 2 Sandy (2 rows) david 4.2 数据迁移后更新序列

truncate tbl_xulie; TRUNCATE # EagleMilesSimonRock); PeterSallyNicoleMonicaRenee name --+-------- 15 Sandy 16 David 17 Eagle 18 Miles 19 Simon 20 Rock 21 Peter 22 Sally 23 Nicole 24 Monica 25 Renee (11=# copy tbl_xulie to /tmp/tbl_xulie.sql; COPY alter sequence tbl_xulie_id_seq restart 100; ALTERselect currval(); currval ------- 25 (select nextval(); nextval ------- 101beginBEGINfrom select setval(',255)">max(id)) tbl_xulie; setval ------ endCOMMITFlash Renee 26 Flash (1227五、序列函数

下面序列函数,为我们从序列对象中获取最新的序列值提供了简单和并发读取安全的方法。

函数 返回类型 描述
nextval(regclass) bigint 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。
currval(regclass) bigint 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。
lastval() bigint 返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。
setval(regclass,bigint) bigint 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。
setval(regclass,bigint,boolean) bigint 重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为truefalse。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。

5.1查看下一个序列值

------- 34 5.2 查看序列最近使用值

5.3 重置序列

方法一:使用序列函数

a.setval(regclass,bigint)

); setval ------ ); ); Sandy 3 David ( b.setval(regclass,boolean)

b.1setval(regclass,true)

,true); setval 效果同a.setval(regclass,bigint)

b.2setval(regclass,false)

方法二:修改序列

修改序列的语法:

ALTER SEQUENCE name  start ]
     RESTART [ [ WITH  restart ] ]
    ]
ALTER SEQUENCE name OWNER TO new_owner
ALTER SEQUENCE name RENAME  new_name
ALTER SEQUENCE name SET SCHEMA new_schema
; ERROR: RESTART value (0) cannot be less than MINVALUE () david六、删除序列

语法:

DROP SEQUENCE IF EXISTS ] name CASCADE | RESTRICT 当有表字段使用到PG序列时,不能直接删除。

drop sequence tbl_xulie2_id_seq; ERROR: cannot drop sequence tbl_xulie2_id_seq because other objects depend on it DETAIL: default for table tbl_xulie2 column id depends sequence tbl_xulie2_id_seq HINT: Use DROP ... CASCADE to the dependent objects too. daviddrop tbl_xulie2; DROP sequence tbl_xulie2_id_seq; DROP 说明:对于序列是由建表时指定serial 创建的,删除该表的同时,对应的序列也会被删除。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读