PostgreSQL 序列 PostgreSQL Alias 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; 输出 执行上述命令后,我们会得到如下消息窗口,显示升序序列已经创建成功。 在这里,我们还可以使用nextval() 函数从序列中获取下一个值。 SELECT nextval('jtpsequence'); 输出 执行上述命令后,我们将得到以下输出,显示序列中的下一个值。 如果我们再次执行上述命令,我们将从序列中获取下一个值: SELECT nextval('jtpsequence'); 输出 执行上述命令后,我们将获得以下输出,其中显示了序列中的下一个值。 生成降序序列的示例 在下面的示例中,以下命令用于使用循环选项生成从 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'); 输出 执行上述命令后,我们将得到以下输出,按降序显示序列中的值。 创建与表列相关的序列 让我们看一个示例以了解如何创建与表列相关的序列。 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\表创建到组织数据库中。 步骤 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; 输出 执行上述命令后,新序列已经创建成功: 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\表中。 注意:在上面的命令中,我们使用 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\表中存在的数据: 列出数据库中的所有序列 在以下命令中,我们列出了现有数据库中存在的所有序列: SELECT relname sequence_name FROM pg_class WHERE relkind = 'S'; 输出 执行上述命令后,我们将得到以下结果,其中显示了组织数据库中所有序列的列表: 删除序列 一旦表被删除,它会自动删除,或者如果序列与表列连接,则表的列被删除。 手动,我们可以使用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的序列被用作Sequence对象创建序列的列表。 我们已经使用 CREATE SEQUENCE 命令创建了一个新的序列号 在本节中,我们还将了解如何使用CREATE SEQUENCE创建升序和降序序列 我们使用NEXTVAL()函数用于检索从序列中的下一个值。 我们还看到了使用DROP SEQUENCE / DROP TABLE删除序列的示例 PostgreSQL Alias PostgreSQL 标识列