postgres的序列(Sequence)的使用_postgre 序列

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

david(# id serial,
david(# name text);
NOTICE: CREATE TABLE will create implicit sequence “tbl_xulie_id_seq” for serial column “tbl_xulie.id”
CREATE 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 } ]


**实例 :**  
 1、查询数据库中有哪些序列



–查看数据库中有哪些序列
–r =普通表, i =索引,S =序列,v =视图,m =物化视图, c =复合类型,t = TOAST表,f =外部表
select * from pg_class where relkind=‘S’


**2、查找Sequence中的值**  
 SELECT nextval(‘seq\_commodity’);  
 这里nextval表示下一个值  
 **3、查看表中的 序列**



david=# \d tbl_xulie
Table “public.tbl_xulie”
Column | Type | Modifiers
--------±--------±-------------------------------------------------------
id | integer | not null default nextval(‘tbl_xulie_id_seq’::regclass)
name | text |

david=# \d tbl_xulie2
Table “public.tbl_xulie2”
Column | Type | Modifiers
--------±--------±--------------------------------------------------------
id | integer | not null default nextval(‘tbl_xulie2_id_seq’::regclass)
name | text |


4、查看序列属性



david=# \d tbl_xulie_id_seq
Sequence “public.tbl_xulie_id_seq”
Column | Type | Value
---------------±--------±--------------------
sequence_name | name | tbl_xulie_id_seq
last_value | bigint | 1
start_value | bigint | 1
increment_by | bigint | 1
max_value | bigint | 9223372036854775807
min_value | bigint | 1
cache_value | bigint | 1
log_cnt | bigint | 0
is_cycled | boolean | f
is_called | boolean | f
Owned by: public.tbl_xulie.id


查看序列



david=# select * from tbl_xulie2_id_seq;


## 序列应用


1、在INSERT 命令中使用序列



david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘David’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Sandy’);
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----±------
| David
| Sandy
(2 rows)


**1.2 数据迁移后更新序列**



david=# truncate tbl_xulie;
TRUNCATE TABLE
david=#
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Sandy’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘David’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Eagle’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Miles’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Simon’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Rock’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Peter’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Sally’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Nicole’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Monica’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Renee’);
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----±-------
| Sandy
| David
| Eagle
| Miles
| Simon
| Rock
| Peter
| Sally
| Nicole
| Monica
| Renee
(11 rows)

david=# copy tbl_xulie to ‘/tmp/tbl_xulie.sql’;
COPY 11
david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# alter sequence tbl_xulie_id_seq restart with 100;
ALTER SEQUENCE
david=# select currval(‘tbl_xulie_id_seq’);
currval

(1 row)

david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)

david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)

david=# begin;
BEGIN
david=# copy tbl_xulie from ‘/tmp/tbl_xulie.sql’;
COPY 11
david=# select setval(‘tbl_xulie_id_seq’, max(id)) from tbl_xulie;
setval

(1 row)

david=# end;
COMMIT
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Flash’);
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----±-------
| Sandy
| David
| Eagle
| Miles
| Simon
| Rock
| Peter
| Sally
| Nicole
| Monica
| Renee
| Flash
(12 rows)

david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)


## 序列函数


下面序列函数,为我们从序列对象中获取最新的序列值提供了简单和并发读取安全的方法。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200317094325179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3,size_16,color_FFFFFF,t_70)  
 1、1查看下一个序列值



david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)

david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)


1.2 查看序列最近使用值



david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)

david=# select currval(‘tbl_xulie_id_seq’);
currval

(1 row)

david=# select currval(‘tbl_xulie_id_seq’);
currval

(1 row)


## 重置序列


**1、1方法一:使用序列函数**


a. setval(regclass, bigint)



david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# select setval(‘tbl_xulie_id_seq’, 1);
setval

(1 row)

david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Sandy’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘David’);
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----±------
| Sandy
| David
(2 rows)

david=# select currval(‘tbl_xulie_id_seq’);
currval

(1 row)

david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)


b. setval(regclass, bigint, boolean)


b.1 setval(regclass, bigint, true)



david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# select setval(‘tbl_xulie_id_seq’, 1, true);
setval

(1 row)

david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Sandy’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘David’);
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----±------
| Sandy
| David
(2 rows)


效果同a. setval(regclass, bigint)


b.2 setval(regclass, bigint, false)  
 **方法二:修改序列**  
 **修改序列的语法:**  
 1、1



ALTER SEQUENCE 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.column | NONE } ]
ALTER SEQUENCE name OWNER TO new_owner
ALTER SEQUENCE name RENAME TO new_name
ALTER SEQUENCE name SET SCHEMA new_schema


**实例:**



david=# truncate tbl_xulie;
TRUNCATE TABLE
david=# alter sequence tbl_xulie_id_seq restart with 0;
ERROR: RESTART value (0) cannot be less than MINVALUE (1)
david=# alter sequence tbl_xulie_id_seq restart with 1;
ALTER SEQUENCE
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘David’);
INSERT 0 1
david=# insert into tbl_xulie values (nextval(‘tbl_xulie_id_seq’), ‘Sandy’);
INSERT 0 1
david=# select * from tbl_xulie;
id | name
----±------
| David
| Sandy
(2 rows)

david=# select nextval(‘tbl_xulie_id_seq’);
nextval

(1 row)


## 删除序列


**语法:**



DROP SEQUENCE [ IF EXISTS ] name [, …] [ CASCADE | RESTRICT ]


当有表字段使用到PG序列时,不能直接删除。



david=# 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 on sequence tbl_xulie2_id_seq
HINT: Use DROP … CASCADE to drop the dependent objects too.
david=# drop table tbl_xulie2;
DROP TABLE
david=# drop sequence tbl_xulie2_id_seq;
DROP SEQUENCE


**说明**:对于序列是由建表时指定serial 创建的,删除该表的同时,对应的序列也会被删除。


## 2、PostgreSQL数据库实现表字段的自增


在使用Mysql时,创建表结构时可以通过关键字auto\_increment来指定主键是否自增。但在Postgresql数据库中,虽然可以实现字段的自增,但从本质上来说却并不支持Mysql那样的自增。  
 **Postgresql的自增机制**  
 Postgresql中字段的自增是通过序列来实现的。整体机制是:1、序列可以实现自动增长;2、表字段可以指定默认值。3、结合两者,将默认值指定为自增序列便实现了对应字段值的自增。  
 Postgresql提供了三种serial数据类型:smallserial,serial,bigserial。它们与真正的类型有所区别,在创建表结构时会先创建一个序列,并将序列赋值给使用的字段。  
 也就是说,这三个类型是为了在创建唯一标识符列时方便使用而封装的类型。  
 bigserial创建一个bigint类型的自增,serial创建一个int类型的自增,smallserial创建一个smallint类的自增。  
 **自增方式一示例**  
 使用示例如下:



create table biz_test(id serial PRIMARY KEY,name varchar);


此时生成的表结构为:



aa=# \d biz_test
Table “public.biz_test”
Column | Type | Modifiers
--------±------------------±------------------------------------------------------
id | integer | not null default nextval(‘biz_test_id_seq’::regclass)
name | character varying |
Indexes:
“biz_test_pkey” PRIMARY KEY, btree (id)


我们可以看到ID字段默认值为nextval(‘biz\_test\_id\_seq’::regclass)。也就是说,在执行创建语句时首先创建了一个以“表名”+"\_id\_seq"的序列。然后再将该序列赋值给id字段。对应序列的类型为Integer类型。


此时,通过一条insert语句来验证一下是否实现了自增。



aa=# insert into biz_test(name) values(‘Tom’);
INSERT 0 1


执行查询语句查看插入的数据:




![img](https://img-blog.csdnimg.cn/img_convert/424b8a5214d4fdd19c2afa3f7bd46898.png)
![img](https://img-blog.csdnimg.cn/img_convert/102babeb466f037a2b6115855a8448b4.png)
![img](https://img-blog.csdnimg.cn/img_convert/a4bef5f592e758ed3fd545b57a7a6ce4.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

。


此时,通过一条insert语句来验证一下是否实现了自增。



aa=# insert into biz_test(name) values(‘Tom’);
INSERT 0 1


执行查询语句查看插入的数据:




[外链图片转存中...(img-Tb4Cy9Z1-1715817152371)]
[外链图片转存中...(img-fPzZ8tH4-1715817152372)]
[外链图片转存中...(img-mkpbCWbB-1715817152372)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值