PostgreSQL 序列


PostgreSQL 序列

在本节中,我们将了解PostgreSQL Sequence的工作原理、PostgreSQL Sequence示例,并了解如何使用序列对象创建数字序列,并查看nextval() 函数示例

我们还看到了使用CREATE SEQUENCE命令创建升序和降序序列并在DROP SEQUENCE命令的帮助下删除序列的示例。

什么是 PostgreSQL 序列?

Sequence 是一个生成器,用于创建一个渐进式数字,它可以帮助自动生成单个主键并同步各个行或表中的键。

PostgreSQL 中,序列是用户定义的模式绑定对象,它根据特定要求创建整数序列。

在 PostgreSQL 序列中,数字的顺序很重要。比如{5,6,7,8,9,10}和{10,9,8,7,6,5}是完全不同的序列。

我们正在使用CREATE SEQUENCE命令在 PostgreSQL 中生成一个序列。

PostgreSQL CREATE SEQUENCE 命令

  • PostgreSQL的CREATE SEQUENCE命令用于产生原始序列号生成器,其中还包括生成并设定一个新的不同的单行表的名称。
  • 生成器将由质疑语句的用户维护。
  • PostgreSQL 序列建立在bigint 算法之上;因此,范围-9223372036854775808 到 9223372036854775807。而且我们不能超过一个八字节的范围
  • 在 PostgreSQL 中,序列名称必须与类似模式中的任何附加序列、表、视图、索引或外部表不同
  • 该序列是在特定模式中创建的,如果之前给出了模式名称,则它是在现有模式中生成的。
  • 一旦序列生成我们可以使用currval、setval 和 nextval函数对序列进行操作。
  • 生成临时序列时不能指定模式名称,因为临时序列出现在特殊模式中。

PostgreSQL 创建序列命令的语法

PostgreSQL 创建序列的语法如下:

CREATE SEQUENCE [ IF NOT EXISTS ] sequence_name  
    [ AS { SMALLINT | INT | BIGINT } ]  
    [ 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 } ]

在上面的语法中,我们使用了以下参数:

范围 描述
sequence_name sequence_name 不同于类似模式中的任何其他序列、索引、表、视图或外部表。我们可以在CREATE SEQUENCE之后定义序列名称并且IF NOT EXISTS 条件仅在它不存在时才临时生成一个新序列。
[ AS { SMALLINT \ INT \ BIGINT } ] 调节序列的最大值和最小值的序列的数据类型。我们可以定义序列的数据类型,其中支持的数据类型为INT、BIGINT和SMALLINT。如果我们忘记提及数据类型,则将其视为 BIGINT,因为它是 Sequence 的默认数据类型。
[ INCREMENT [ BY ] increment ] 增量描述了值,必须将其添加到现有序列值以生成新值,默认值为 1。此处,正 (+) 数将产生升序,负 (-) 数将产生降序
[ MINVALUE minvalue \ NO MINVALUE ] 如果我们使用NO MINVALUE 和 NO MAXVALUE,则序列将采用默认值。对于升序,最大默认值为Sequence 数据类型最大值默认最小值1。而对于降序序列,最大默认值为-1默认最小值为Sequence 数据类型的最小值
[ MAXVALUE maxvalue \ NO MAXVALUE ][ START [ WITH ] start ] START子句用于定义序列的起始值。并且默认初始值是降序的最大值和升序的最小值
cache 一次可以创建一个值,默认情况下,该序列一次创建一个值,没有缓存。该CACHE参数用于指定的序列号预先分配并存储在存储器中用于较早获得。
CYCLE \ NO CYCLE CYCLE参数允许我们如果达到限制恢复值。在下面的数将是最大值递减序列最小值升序序列。如果我们使用 NO CYCLE,当达到限制时,或者我们正在尝试获取下一个值时,它会在输出中引发错误。该NO CYCLE是默认的,如果我们不定义CYCLE或NO CYCLE
OWNED BY table_name.column_name 最后,使用OWNED BY 参数将表列与序列链接起来。因此,PostgreSQL 会自动丢弃相关序列;如果我们删除表或列。

注意:当我们对表的某列使用SERIAL伪类型时,在后台,PostgreSQL会自动生成一个与该列相关的序列。

PostgreSQL 创建序列示例

让我们看不同的例子来理解PostgreSQL CREATE SEQUENCE是如何工作的。

  • 生成升序序列的示例

在下面的示例,下面的命令使用CREATE SEQUENCE命令用于生成新的递增顺序开始20增量3

CREATE SEQUENCE jtpsequence  
INCREMENT 3  
START 20;

输出

执行上述命令后,我们会得到如下消息窗口,显示升序序列已经创建成功。

PostgreSQL 序列

在这里,我们还可以使用nextval() 函数从序列中获取下一个值。

SELECT nextval('jtpsequence');

输出

执行上述命令后,我们将得到以下输出,显示序列中的下一个值。

PostgreSQL 序列

如果我们再次执行上述命令,我们将从序列中获取下一个值:

SELECT nextval('jtpsequence');

输出

执行上述命令后,我们将获得以下输出,其中显示了序列中的下一个值。

PostgreSQL 序列

  • 生成降序序列的示例

在下面的示例中,以下命令用于使用循环选项生成从 5 到 1 的降序序列:

CREATE SEQUENCE five  
INCREMENT -1  
MINVALUE 1   
MAXVALUE 5  
START 5  
CYCLE;

输出

执行上述命令,我们将得到以下消息,显示降序\已成功创建到组织数据库中。

PostgreSQL 序列

当我们多次执行下面的命令时,我们会看到数字从5、4、3、2、1开始,然后回到 5、4、3、2、1等等:

SELECT nextval('five');

输出

执行上述命令后,我们将得到以下输出,按降序显示序列中的值。

PostgreSQL 序列

  • 创建与表列相关的序列

让我们看一个示例以了解如何创建与表列相关的序列。

Step1:新建表

首先,我们使用 CREATE 命令的帮助创建一个新表作为Purchase_details\并使用INSERT 命令插入一些值。

要在组织数据库中创建Purchase_details\,我们使用CREATE命令。

所述Purchase_details\表包含各列,如Purchase_id,MODULE_ID,Module_text和成本,其中Purchase_id和MODULE_ID列是主键列。

CREATE TABLE Purchase_details(  
    Purchase_id SERIAL,  
    Module_id INT NOT NULL,  
    Module_text VARCHAR NOT NULL,  
    Cost DEC(10,2) NOT NULL,  
    PRIMARY KEY(Purchase_id, Module_id)  
);

输出

执行上述命令时,我们将收到以下消息,显示已成功将Purchase_details\表创建到组织数据库中。

PostgreSQL 序列

步骤 2:创建新序列

成功创建Purchase_details\表后,我们将使用CREATE SEQUENCE命令创建一个新的序列,该序列Purchase_details表的Module_id列链接,如下命令所示:

CREATE SEQUENCE Purchase_module_id  
START 5  
INCREMENT 5  
MINVALUE 5  
OWNED BY Purchase_details.Module_id;

输出

执行上述命令后,新序列已经创建成功:

PostgreSQL 序列

Step3:插入数据

在成功创建Purchase_details\表和Purchase_module_id序列后,我们将在INSERT命令的帮助下将一些值插入到Purchase_details\表中。

下面的命令用于将各种采购行模块插入到Purchase_details\表中。

INSERT INTO   
 Purchase_details(Purchase_id, Module_id, Module_text, cost)  
VALUES  
    (150, nextval('Purchase_module_id'),'Iphone11 max pro',500),  
    (150, nextval('Purchase_module_id'),'Smart LED Tv',650),  
    (150, nextval('Purchase_module_id'),'Home theatre',200);

输出

执行上述命令后,我们会得到如下消息窗口,显示三个值已成功插入到Purchase_details\表中。

PostgreSQL 序列

注意:在上面的命令中,我们使用 nextval() 函数从 Purchase_module_id 序列中检索 Module_id 值。

Step4:检索数据

创建并插入Purchase_details\表的值后,我们将使用SELECT命令从Purchase_details\表中检索数据:

SELECT Purchase_id, Module_id, Module_text, Cost  
FROM Purchase_details;

输出

成功执行上述命令后,我们将得到以下结果,显示 PostgreSQL 返回了Purchase_details\表中存在的数据:

PostgreSQL 序列

  • 列出数据库中的所有序列

在以下命令中,我们列出了现有数据库中存在的所有序列:

SELECT relname sequence_name  
FROM  pg_class   
WHERE  relkind = 'S';

输出

执行上述命令后,我们将得到以下结果,其中显示了组织数据库中所有序列的列表:

PostgreSQL 序列

  • 删除序列

一旦表被删除,它会自动删除,或者如果序列与表列连接,则表的列被删除。

手动,我们可以使用DROP SEQUENCE命令删除序列。

删除 PostgreSQL 序列的语法

删除 PostgreSQL 序列的语法如下:

DROP SEQUENCE [ IF EXISTS ] sequence_name [, ...]   
[ CASCADE | RESTRICT ];

在上面的语法中,我们使用了以下参数:

参数 描述
Sequence_name 它用于定义我们要删除的序列的名称。
If EXISTS 如果我们需要一次删除多个序列,我们可以使用逗号分隔的序列名称列表。如果序列存在,IF EXISTS参数会暂时删除它。
CASCADE 如果我们想根据 Sequence 递归删除对象,我们可以使用 CASCADE 选项。

PostgreSQL DROP SEQUENCE 命令示例

为了删除Purchase_details\表,我们使用了DROP TABLE命令;同时,序列Purchase_module_id与连接MODULE_ID的的Purchase_details

因此,它也被反复删除,正如我们在下面的命令中看到的:

DROP TABLE Purchase_details;

输出

执行上面的命令后,我们会看到下面的消息窗口,显示Purchase_details\已成功删除。

PostgreSQL 序列

概述

PostgreSQL 序列部分,我们学习了以下主题:

  • PostgreSQL的序列被用作Sequence对象创建序列的列表。
  • 我们已经使用 CREATE SEQUENCE 命令创建了一个新的序列号
  • 在本节中,我们还将了解如何使用CREATE SEQUENCE创建升序降序序列
  • 我们使用NEXTVAL()函数用于检索从序列中的下一个值。
  • 我们还看到了使用DROP SEQUENCE / DROP TABLE删除序列的示例