📜  PostgreSQL序列

📅  最后修改于: 2020-11-30 01:27:29             🧑  作者: Mango

PostgreSQL序列

在本节中,我们将了解PostgreSQL Sequence的工作原理,PostgreSQL Sequence的示例,并了解如何使用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 Create Sequence命令的语法

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

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

Parameter Description
sequence_name
  • The sequence_name is different from any other sequences, indexes, tables, views, or foreign tables in a similar schema.
  • We can define the sequence name subsequently the CREATE SEQUENCE
  • And the IF NOT EXISTS condition tentatively generates a new sequence only if it does not exist.
[ AS { SMALLINT | INT | BIGINT } ]
  • The data type of the sequence which regulates the sequence’s maximum and minimum values.
  • We can define the data type of the sequence, where the supported data type is INT, BIGINT, and SMALLINT.
  • If we forgot to mention the data type, it takes it as BIGINT because it is a default data type for Sequence.
[ INCREMENT [ BY ] increment ]
  • The increment describes the value, which has to be added to the existing sequence value to generate a new value and by default value is 1.
  • Here, a positive (+) number will produce an ascending sequence, whereas a negative (-) number will generate a descending sequence.
[ MINVALUE minvalue | NO MINVALUE ]
[ MAXVALUE maxvalue | NO MAXVALUE ]
  • If we use the NO MINVALUE and NO MAXVALUE, the sequence will take the default value.
  • For an ascending sequence,the maximum default value is the maximum value of the Sequence data type, and the default minimum value is 1.
  • And for a descending sequence, the maximum default value is -1, and the default minimum value is the minimum value of the data type of the Sequence.
[ START [ WITH ] start ]
  • The STARTclause is used to define the starting value of the sequence.
  • And the default initial value is Max value for descending ones and Min value for ascending sequences.
cache
  • One value can be created at a time, and by default, the sequence creates one value at a time that is no cache.
  • The CACHE parameter is used to specify the total sequence numbers pre-allocated and stored in memory for earlier access.
CYCLE | NO CYCLE
  • The CYCLE parameter allows us to resume the value if the limit is reached. The following number will be the maximum value for the descending sequence and the minimum value for the ascending sequence.
  • If we use NO CYCLE, when the limit is reached, or we are trying to get the next value, it will raise an error in the output.
  • The NO CYCLE is the default if we do not define the CYCLE or NO CYCLE.
OWNED BY table_name.column_name
  • At last, the OWNED BY parameter is used to link the table column with the sequence.
  • Therefore, PostgreSQL will automatically drop the related sequence; if we drop the table or the column.

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

PostgreSQL创建序列的示例

让我们看不同的示例,以了解PostgreSQL CREATE SEQUENCE的工作方式。

  • 产生升序的例子

在下面的示例中,以下命令用于CREATE SEQUENCE命令以生成新的升序,从20开始,增量3

CREATE SEQUENCE jtpsequence
INCREMENT 3
START 20;

输出量

执行完上述命令后,我们将获得以下消息窗口,该窗口显示升序已成功创建。

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

SELECT nextval('jtpsequence');

输出量

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

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

SELECT nextval('jtpsequence');

输出量

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

  • 产生降序的例子

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

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

输出量

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

当我们多次执行以下命令时,我们将看到该数字从5,4,3,2,1开始,再回到5,4,3,2,1,依此类推:

SELECT nextval('five');

输出量

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

  • 创建与表列相关的序列

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

步骤1:创建一个新表

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

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

Purchase_details表包含各个列,例如Purchase_id,Module_id,Module_text和Cost,其中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表已成功创建到Organization数据库中。

步骤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;

输出量

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

第三步:插入数据

成功创建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表中。


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

步骤4:撷取资料

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

SELECT Purchase_id, Module_id, Module_text, Cost
FROM Purchase_details;

输出量

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

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

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

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

输出量

实施上述命令后,我们将获得以下结果,该结果显示列出组织数据库中的所有序列:

  • 删除序列

一旦删除了表,它将自动删除;如果将序列与表列连接,则将删除表的列。

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

删除PostgreSQL序列的语法

删除PostgreSQL序列的语法如下:

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

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

Parameters Description
Sequence_name
  • It is used to define the name of the sequence, which we want to delete.
If EXISTS
  • We can use a list of comma-separated sequence names if we need to remove several sequences at a time.
  • And the IF EXISTS parameter temporarily removes the sequence if it present.
CASCADE
  • if we want to delete objects based on the Sequence recursively, we can use the CASCADE option.

PostgreSQL DROP SEQUENCE命令的示例

要删除Purchase_details表,我们使用了DROP TABLE命令;同时,序列Purchase_module_idPurchase_detailsMODULE_ID连接。

因此,它也会被重复删除,如下面的命令所示:

DROP TABLE Purchase_details;

输出量

执行完上述命令后,我们将获得以下消息窗口,该窗口显示Purchase_details已成功删除。

总览

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

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