PostgreSql 序列

一、概述

  在 PostgreSQL 中,序列用于生成唯一标识符,通常用于为表的主键列生成连续的唯一值。若目的仅是为表字段设置自增 id,可考虑序列类型来实现,可参考《PostgreSql 设置自增字段》

二、创建序列

2.1 语法

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 } ]

参数说明

TEMPORARY or TEMP:如果被指定,只会为这个会话创建序列对象,并且在会话退出时自动删除它。当临时序列存在时,已有的同名永久序列(在这个会话中)会变得不可见,不过可以用模式限定的名称来引用同名永久序列。
IF NOT EXISTS:如果已经存在一个同名的关系时不要抛出错误。这种情况下会发出一个提示。注意这不保证现有的关系与即将创建的序列相似它甚至可能都不是一个序列。
name:要创建的序列的名称(可以是模式限定的)。
data_type:可选的子句 AS data_type 制定序列的数据类型。有效类型是 smallint、integer、和 bigint。默认是 bigint。 数据类型决定了序列的默认最小和最大值。
increment:可选的子句 INCREMENT BY increment 指定为了创建新值会把哪个值加到当前序列值上。一个正值将会创造一个上升序列,负值会创造一个下降序列。默认值是 1。
minvalue|NO MINVALUE:可选的子句 MINVALUE minvalue 决定一个序列能产生的最小值。如果没有提供这个子句或者指定了 NO MINVALUE,那么会使用默认值。升序序列的默认值为1。降序序列的默认值为数据类型的最小值。
maxvalue|NO MAXVALUE:可选的子句 MAXVALUE maxvalue 决定该序列的最大值。如果没有提供这个子句或者指定了 NO MAXVALUE,那么将会使用默认值。升序序列的默认值是数据类型的最大值。降序序列的默认值是 -1。
start:可选的子句 START WITH start 允许序列从任何地方开始。对于上升序列和下降序列来说,默认的开始值分别是 minvalue 和 maxvalue。
cache:可选的子句 CACHE cache 指定要预分配多少个序列数并且把它们放在内存中以便快速访问。最小值为 1 (一次只生成 一个值,即没有缓存),默认值也是 1。
CYCLE|NO CYCLE:对于上升序列和下降序列,CYCLE 选项允许序列 在分别达到 maxvalue 和 minvalue 时回卷。如果达到该限制,下一个产生的数字将分别是 minvalue 和 maxvalue。如果指定了 NO CYCLE,当序列到达其最大值后任何 nextval 调用将返回一个错误。如果 CYCLE 和 NO CYCLE 都没有被指定,则默认为 NO CYCLE。
OWNED BY table_name.column_name|OWNED BY NONE:OWNED BY 选项导致序列被与一个特定的表列关联在一起,这样如果该列(或者整个表)被删除,该序列也将被自动删除。指定的表必须和序列具有相同的拥有者并且在同一个模式中。默认选项 OWNED BY NONE指定该序列不与某个列关联。

常用操作函数

操作函数描述
nextval ( regclass ) → bigint将序列对象推进到下一个值并返回该值。
setval ( regclass, bigint [, boolean ] ) → bigint设置序列对象的当前值,boolean 为 false 时设置下个序列值。
currval ( regclass ) → bigint返回 nextval 在当前会话中为该序列最近获取的值。
lastval () → bigint返回 nextval 在当前会话中最近返回的值。

2.2 示例

--创建序列
postgres=# create sequence seq_t;
CREATE SEQUENCE--插入数据时使用序列
postgres=# insert into t values(nextval('seq_t'),'zhao');
INSERT 0 1
postgres=# insert into t values(nextval('seq_t'),'qian');
INSERT 0 1
postgres=# insert into t values(nextval('seq_t'),'sun');
INSERT 0 1
postgres=# select * from t;id | name
----+------1 | zhao2 | qian3 | sun
(3 rows)--查询序列当前值
postgres=# select currval('seq_t');currval
---------3
(1 row)--更新序列值为下一个
postgres=# select nextval('seq_t');nextval
---------4
(1 row)postgres=# select currval('seq_t');currval
---------4
(1 row)--设置序列为指定值
postgres=# select setval('seq_t',100);setval
--------100
(1 row)postgres=# select currval('seq_t');currval
---------100
(1 row)--建表时字段默认使用序列(通常序列字段设置为主键)
postgres=# create table t(id int default nextval('seq_t')primary key,name varchar);
CREATE TABLE
postgres=# \d tTable "public.t"Column |       Type        | Collation | Nullable |          Default
--------+-------------------+-----------+----------+----------------------------id     | integer           |           | not null | nextval('seq_t'::regclass)name   | character varying |           |          |
Indexes:"t_pkey" PRIMARY KEY, btree (id)

三、修改序列

3.1 语法

ALTER SEQUENCE [ IF EXISTS ] name[ AS data_type ][ 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 } ]
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name
ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema

参数说明

name:要修改的序列的名称(可以是模式限定的)。
IF EXISTS:在序列不存在时不要抛出一个错误。这种情况下会发出一个提示。
data_type:可选子句 AS data_type 改变序列的数据类型。有效类型是 smallint、integer 和 bigint。当且仅当先前的最小值和最大值是旧数据类型的最小值或最大值时(换句话说,如果序列是使用 NO MINVALUE 或 NO MAXVALUE,隐式或显式创建的),则更改数据类型会自动更改序列的最小值和最大值。否则,将保留最小值和最大值,除非将新值作为同一命令的一部分给出。如果最小值和最大值不符合新的数据类型,则会生成错误。
increment:子句 INCREMENT BY increment 是可选的。一个正值将产生一个上升序列,一个负值会产生一个下降序列。如果没有指定,旧的增量值将被保持。
minvalue|NO MINVALUE:可选的子句 MINVALUE minvalue 决定一个序列能产生的最小值。如果指定了 NO MINVALUE,上升序列和下降序列的默认值分别是 1 和 数据类型的最小值。如果这些选项都没有被指定,将保持当前的最小值。
maxvalue|NO MAXVALUE:可选的子句 MAXVALUE maxvalue 决定一个序列能产生的最大值。如果指定了 NO MAXVALUE,上升序列和下降序列的默认值分别是数据类型的最大值和 -1。如果这些选项都没有被指定,将保持当前的最大值。
start:可选的子句 START WITH start 更改该序列被记录的开始值。这对于当前序列值没有影响,它会简单地设置未来 ALTER SEQUENCE RESTART 命令将会使用的值。
restart:可选的子句 RESTART [ WITH restart ] 更改该序列的当前值。这类似于用 is_called = false 调用setval函数:被指定的值将会被 下一次 nextval 调用返回。写上没有 restart 值的 RESTART 等效于提供被 CREATE SEQUENCE 记录的或者上一次被 ALTER SEQUENCE START WITH 设置的开始值。与 setval 调用相比,序列上的 RESTART 操作是事务性的并阻止并发事务从同一序列中获取数字。如果这不是所需的操作模式,则应使用 setval。
cache:子句 CACHE cache 使得序列数字被预先分配并且保存在内存中以便更快的访问。最小值是 1(每次只产生一个值,即无缓存)。如果没有指定,旧的缓冲值将被保持。
CYCLE:可选的 CYCLE 关键词可以被用来允许该序列在达到 maxvalue(上升序列)或 minvalue(下降序列)时回卷。如果到达该限制,下一个被产生的数字将分别是 minvalue 或者 maxvalue。
NO CYCLE:如果指定了可选的 NO CYCLE 关键词,任何在该序列到达其最大值后的 nextval 调用将会返回一个错误。如果既没有指定 CYCLE 也没有指定 NO CYCLE,旧的循环行为将被保持。
OWNED BY table_name.column_name|OWNED BY NONE:OWNED BY 选项导致该序列与一个特定的表列相关联,这样如果该列(或者整个表)被删除,该序列也会被自动删除。如果指定,这种关联会替代之前为该序列指定的任何关联。被指定的表必须具有相同的 拥有者并且与该序列在同一个模式中。指定 OWNED BY NONE 可以移除任何现有的关联,让该序列 “自立”。
new_owner:该序列的新拥有者的用户名。
new_name:该序列的新名称。
new_schema:该序列的新模式。

3.2 示例

--修改序列隶属于表,删除表时索引也关联删除
postgres=# alter sequence seq_t owned by t.id;
ALTER SEQUENCE
postgres=# \d seq_tSequence "public.seq_t"Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache
--------+-------+---------+---------------------+-----------+---------+-------bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
Owned by: public.t.idpostgres=# drop table t;
DROP TABLE
postgres=# \d seq_t
Did not find any relation named "seq_t".

四、删除序列

4.1 语法

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

参数说明

IF EXISTS:如果该序列不存在则不要抛出一个错误,而是发出一个提示。
name:一个序列的名称(可以是模式限定的)。
CASCADE:自动删除依赖于该序列的对象,然后删除所有依赖于那些对象的对象。
RESTRICT:如果有任何对象依赖于该序列,则拒绝删除它。这是默认值。

4.2 示例

postgres=# drop sequence seq_t;
DROP SEQUENCE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis:四、双写一致性的原理和解决方案(延时双删、分布式锁、异步通知MQ/canal)、面试回答模板

双写一致性 场景导入 如果现在有个数据要更新,是先删除缓存,还是先操作数据库呢?当多个线程同时进行访问数据的操作,又是什么情况呢? 以先删除缓存,再操作数据库为例 多个线程运行的正常的流程应该如下…

在linux下正确安装部署locust

我们在安装python,pip之后,利用pip安装locust并不能执行相应的locust命令,原因是linux下面无像在windows下面pycharm一样的解释器,这个时候需要创建虚拟环境,在虚拟环境下面能运行的环境中,才能运行locust&…

基于QTreeWidget实现多级组织结构

基于QTreeWidget实现多级组织结构以及带Checkbox的选择树 采用基于QWidgetMingw实现的多级组织结构树 通过QTreeWidget控件实现的多级组织结构树。 Qt相关系列文章: 一、Qt实现的聊天画面消息气泡 二、基于QTreeWidget实现多级组织结构 三、基于QTreeWidget实现带Ch…

OceanBase数据库初识

文章目录 说明分布式数据库发展发展历史OceanBase和传统数据库的对比总结 OceanBase数据库产品简介应用案例 OceanBase数据库产品OceanBase数据库内核OceanBase开发者中心(ODC)产品架构OMS核心功能简介 说明 本文仅供学习和交流学习内容参考官方的培训资…

【已解决】解决无法找到sun.misc.BASE64Encoder的jar包的解决方法

idea中可能会出现没有sun.misc.BASE64Encoder的jar包。但是64位编码却需要用到.BASE64Encoder。有以下两种方法: 错误现象: 错误原因: 1.JDK改为8(原因是/lib/tool.jar和/lib/rt.jar已经从Java SE 9中删除)&#xff…

代码随想录二刷 |二叉树 |145.二叉树的后序遍历

代码随想录二刷 |二叉树 |145.二叉树的后序遍历 题目描述解题思路代码实现递归法迭代法 题目描述 145.二叉树的后序遍历 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,…

【算法集训】基础数据结构:九、完全二叉树

完全二叉树是二叉树的一种,它是除了叶子节点外其余各节点都为满二叉树,叶子节点只在倒数第一层或第二层出现。 即使是最后一层的叶子节点也是从左到右依次排列,中间不会空。 每一层都是按从左到右的顺序编号,所以一个节点i的叶子节…

自动化测试(二)selenium八大获取元素方法及对象操作

目录 webdriver API 脚本实例 元素的定位 1. 通过id定位: 2. 通过name方式定位 3. 通过tag name(标签名)定位 4. 通过class name (类名)方式定位 5. 通过CSS 方式定位 6. 通过xpath方式定位 7. link text定位 8. Parti…

[原创][R语言]股票分析实战:周级别涨幅趋势的相关性

[简介]常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、De…

【PostgreSQL】从零开始:(一)初识PostgreSQL

从零开始:(一)初识PostgreSQL PostgreSQL数据库介绍为什么使用 PostgreSQL?那么多最终用户,云厂商为什么要贡献核心代码?基于PostgreSQL底层开发的好处:为什么要学习PostgreSQL?截止本文发布之日&#xff0…

将一个带头结点单链表 A分解为A 和 B 使得 A 中为奇数项元素,B 中为偶数项元素,保持其相对顺序不变。

题目描述:将一个带头结点单链表 A分解为A 和 B 使得 A 中为奇数项元素,B 中为偶数项元素,保持其相对顺序不变。 void EvenAndOdd(LinkList &A){LinkList *B (LinkList)malloc(sizeof(LNode));B->next NULL;LNode *p A->next;LN…

数据库 02-03 补充 SQL的子查询(where,from),子查询作为集合来比较some,exists,all(某一个,存在,所有)

子查询: where字句的子查询: 通常用in关键字: 举个例子: in关键字: not in 关键字: in 也可以用于枚举集合: where中可以用子查询来作为集合来筛选元祖。 some,all的运算符号…

一个程序,实现随机随机数据生成自由

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 发现又是好久没有和大家见面了,先给大家分享一下最近的研究方向和成果: 最近接到的…

Shell三剑客:sed(简介)

一、前言 Stream EDitor:流编辑 sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后&…

【Spark精讲】Spark五种JOIN策略

目录 三种通用JOIN策略原理 Hash Join 散列连接 原理详解 Sort Merge Join 排序合并连接 Nested Loop 嵌套循环连接 影响JOIN操作的因素 数据集的大小 JOIN的条件 JOIN的类型 Spark中JOIN执行的5种策略 Shuffle Hash Join Broadcast Hash Join Sort Merge Join C…

Echarts 热力图与折线图的结合

热力图与折线图结合使用(文末含源码) 这种需求并不多见,遇到后第一时间翻看了Echars官方文档,并没有发现类似的例子。于是自己动手合并了双轴,后发现折线图会被遮盖。经过排查发现了一个关键参数:visualMap的配置。这个配置在热力…

Go delve调试工具的简单应用

Delve是个啥 Delve is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you’re using a debugger, things aren’t go…

前端基础——鼠标事件对象属性和方法

button:0(未按下)1(左键)2(右键)4(中键) clientX/clientY(表示事件在客户端区域的水平和垂直坐标,左上为原点) ctrlKey表示鼠标事件发生时是否按下了ctrl键 MouseEvent.offsetX和MouseEvent.offsetY表示鼠标相对于目标节点内部填充区域的偏移量 MouseEvent.screenX和MouseE…

四十四、Redis的数据持久化(RDB、AOF)

目录 一、定义 二、RDB 1、默认方案: 2、bgsave方案: 3、bgsave的基本流程: 4、RDB会在什么时候执行?save 60 1000代表什么含义? 5、RDB的缺点: 三、AOF 1、定义: 2、流程:…

二叉树遍历

今天讲的不是 leetcode 上的题,但也和二叉树有关,一道比较有意思的题 牛客网上的题,如果看懂了,也可以来试着做一下: 二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 题目 编一个程序,读入用户输入的一串先…