PostgreSQL教程

PostgreSQL 自增列

在本节中,我们将了解 PostgreSQL IDENTITY和GENERATED约束的工作原理,该约束用于生成特定列的PostgreSQL自增列,更改自增列的示例,并通过示例了解 序列选项的工作。
我们还将看到向其中添加自增列的示例当前表并修改"标识"列以使用 ALTER TABLE 命令删除 GENERATED AS IDENTITY 约束。

什么是PostgreSQL自增列?

从 PostgreSQL 版本10中,PostgreSQL开发人员宣布了一个名为 GENERATED AS IDENTITY ,用于自动为列分配唯一编号。

PostgreSQL自增列的语法

PostgreSQL GENERATED AS IDENTITY约束的语法如下:
column_name type GENERATED { ALWAYS | BY default } AS IDENTITY[ ( sequence_option ) ]
在上面的语法中,我们有以下几点,在实时示例中使用时需要记住:
类型参数可以是 SMALLINT,INT, BIGINT 始终生成的用于要求PostgreSQL为自增列不断创建一个值。 如果我们尝试更新值或将值插入 GENERATED ALWAYS AS IDENTITY"列中,PostgreSQL将发生错误。 但是,如果我们提供用于插入或更新的值,则 GENERATED BY DEFAULT (生成的默认值)用于告诉PostgreSQL为标识列创建一个值。 要使用系统生成的值,PostgreSQL将使用特定的值插入到Identity列中。

PostgreSQL自增列示例

让我们看看不同的示例来了解 PostgreSQL自增列的工作原理。
我们将在CREATE命令的帮助下创建一个新表,作为 Vegetable ,并使用INSERT命令插入一些值。
要将 Vegetable 创建到 组织数据库,我们使用 CREATE 命令。
Vegetable 表包含两列,例如 veggie_id和Veggie_name 列,我们在其中使用 Veggie_id 作为 "身份"列:
CREATE TABLE Vegetable  (
Veggie_id int GENERATED ALWAYS AS IDENTITY,
Veggie_name VARCHAR NOT null
);
输出
在执行上述命令时,我们将得到以下消息,该消息显示 Vegetable >表已成功创建到 Organization 数据库中。
PostgreSQL标识列
成功创建 Vegetable 表后,我们将在INSERT命令的帮助下向其中插入一些值。
INSERT INTO Vegetable(veggie_name)
VALUES ('Sweet Potato');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示一个值已成功插入 Vemtable 表。
PostgreSQL自增列
我们知道 Veggie_id 列具有 GENERATED AS IDENTITY约束,这就是PostgreSQL为它创建一个值的原因,正如我们在以下命令中看到的那样:
SELECT * FROM Vegetable;
输出
成功执行上述命令后,我们将获得以下输出,其中显示了 Vegetable中的所有数据 表:
PostgreSQL标识列
现在,我们将插入一个新的通过提供Veggie_id和Veggie_name列的值来排行:
INSERT INTO Vegetable(Veggie_id, Veggie_name)
VALUES (2,'Carrot');
输出
执行上述命令后,Postgresql引发以下错误: 我们无法将值插入veggie_id列,因为 Veggie_id列自增列,并被描述为GENERATED ALWAYS。
我们可以使用 覆盖系统值子句在以下命令中解决以上错误:
INSERT INTO Vegetable(Veggie_id, Veggie_name)
OVERRIDING SYSTEM VALUE 
VALUES(2, 'Carrot');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定的值已成功插入 Vegetable 表。
PostgreSQL自增列
注意: 我们可以使用GENERATED BY DEFAULT AS IDENTITY代替其"始终以身份生成"。

通过默认身份生成的示例

让我们看一下示例示例,以了解 默认情况下如何以身份生成 >有效。
Step1
首先,我们将 Vegetable 表删除并重建它通过使用 默认身份生成的代替 始终身份生成的:
DROP TABLE Vegetable;
输出
执行上述命令后,我们将获得以下消息窗口,其中显示 Vegetable 表已成功删除。
PostgreSQL标识列
Step2
现在,我们将使用GENERATED BY DEFAULT AS IDENTITY创建一个类似的表,如以下命令所示:
CREATE TABLE Vegetable  (
Veggie_id int GENERATED BY default AS IDENTITY,
Veggie_name VARCHAR NOT null
);
输出
执行上述命令时,我们将获得以下消息窗口,其中显示 Vegetable 表已成功创建。
PostgreSQL标识列
Step3
再次成功创建 Vegetable表后,我们将使用 INSERT 命令向其中插入一些值,如下所示:
INSERT INTO Vegetable(Veggie_name)
VALUES('Onion');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示一个值已成功插入 Vegetable 表。
PostgreSQL标识列
步骤4
此后,我们将更多值插入具有 Veggie_id Vegetable 表中如以下命令所示:
INSERT INTO Vegetable(Veggie_id, Veggie_name) 
VALUES(2, 'Cabbage'),
(3, 'Broccoli'),
(4, 'Tomato'),
(5, 'Avocado');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示四个值已成功插入 Vegetable 表。
PostgreSQL标识列
注意: 如果我们同时比较两个命令,可以看到使用GENERATED ALWAYS AS IDENTITY约束发生错误,而GENERATED BY DEFAULT AS IDENTITY约束成功执行并且没有提高任何错误。
序列选项示例
我们可以为系统生成的值定义 序列选项,因为 GENERATED AS IDENTITY 约束使用SEQUENCE对象。
让我们看一个示例来了解Sequence选项的工作。
在下面的命令中,我们描述了起始值和增量值,如下所示:
DROP TABLE Vegetable;
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定表已成功 删除
PostgreSQL标识列
现在,我们将创建相同的表( Vemtable ),但这一次,我们使用 开始并递增参数,如以下命令所示:
CREATE TABLE Vegetable (
Veggie_id int GENERATED BY default AS IDENTITY 
(START WITH 5 INCREMENT BY 5),
Veggie_name VARCHAR NOT null);
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示 Vegetable >表已成功创建到 Organization 数据库中。
PostgreSQL标识列
在上述命令中, Veggie_id 列的 系统生成的值 5 增量值也是 5
现在,我们将在帮助下将新值插入 Vegetable 表中 INSERT 命令:
INSERT INTO Vegetable(Veggie_name) 
VALUES('Pumpkin');
输出
执行上述命令后,我们将获得以下输出:
PostgreSQL身份栏
创建和ins之后输入 Vegetable 表的值时,我们将使用 SELECT 命令返回 Vegetable表的所有行:
SELECT * FROM Vegetable;
输出
成功执行上述命令后,我们将获得以下输出,其中显示 Veggie_id的起始值 列为 5 :
PostgreSQL标识列
成功执行以上命令后,我们将在 Vegetable 表中插入更多行:
INSERT INTO Vegetable(Veggie_name) 
VALUES('Zucchini'),
('White Button Mushroom'),
('Cauliflower');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定的值已成功插入 Vegetable 表。
PostgreSQL标识列
第二行的 Veggie_id 是10,因为我们在创建 Vegetable 表时使用了 increment 选项:
SELECT * FROM Vegetable;
输出
成功执行以上命令后,我们将获得以下输出,该输出显示 Vegetable中的所有现有数据。 表:
PostgreSQL标识列

添加自增列到当前表中

我们可以借助以下 ALTER TABLE命令:
将标识列添加到当前表的语法
下图用于添加现有表的标识列:
ALTER TABLE table_name 
ALTER COLUMN column_name 
ADD GENERATED { ALWAYS | BY default } AS IDENTITY { ( sequence_option ) }
让我们看一个示例示例以了解以下内容:
要将标识列添加到现有表中,我们必须执行以下步骤:

第1步: 创建新表

在CREATE命令的帮助下,我们将创建一个新表,作为 Structure
要在 组织数据库中创建 结构 ,我们使用 CREATE 命令。
购买详细信息 表包含两列,例如 Str_id和Str_name
CREATE TABLE Structure (
    Str_id int NOT null,
    Str_name VARCHAR NOT null
);
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示 结构 表已成功创建到 Organization 数据库中。
PostgreSQL标识列

第2步: 将Str_id列修改为Identity列

在以下命令中,我们将使用ALTER Table命令将 Str_id 列更改为自增列:
ALTER TABLE Structure
ALTER COLUMN Str_id ADD GENERATED ALWAYS AS IDENTITY;
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示"结构"表已成功更改。
PostgreSQL身份栏
注意: Str_id列需要具有NOT NULL约束;因此,可以将其修改为标识列。否则,PostgreSQL将发生以下错误:
ERROR:  column "str_id" of relation "structure" must be declared NOT null before an identity can be added
SQL state: 55000

在SQL Shell(psql)中描述结构表

用于描述 SQL中的 Structure 表shell(psql)工具,我们可以使用以下命令,但是在使用describe命令之前,我们将遵循以下过程:
首先,我们将在本地系统中打开 psql ,然后连接到要创建表的数据库。 要连接 Organization 数据库,我们将输入以下命令:
postgres=# \c Organization 
输出
执行上述命令后,我们将获得以下输出:
PostgreSQL身份栏 现在,我们将在 Organization 中输入以下命令来描述"结构"表
\d Structure
输出
在执行上述命令时,我们将检索以下输出,这是我们从 Structure 预期的输出表:
PostgreSQL标识列

更改标识列

ALTER TABLE命令还用于更改当前标识列的功能,如下图所示:
更改标识列的语法
以下语法用于更改标识列:
Alter table table_name 
Alter column  column_name 
{ SET GENERATED { ALWAYS| BY default } | 
 SET sequence_option | RESTART [ [ WITH] restart ] }
让我们看一个示例示例,以更好地了解如何使用ALTER TABLE命令更改标识列:
在以下命令中,我们修改了 Str_id 结构 表中具有 GENERATED BY DEFAULT 约束的列>:
ALTER TABLE Structure 
ALTER COLUMN Str_id SET GENERATED BY DEFAULT;
输出
执行上述命令后,我们将获得以下消息窗口,其中显示 Structure >表已成功 修改
PostgreSQL标识列
描述psql中的 Structure 表的设计;我们将使用与上面类似的命令:
\d Structure 
输出
执行上面的语句后,我们将获得以下输出,这表明 Str_id 列已从 始终生成默认生成
PostgreSQL自增列

删除GENERATED AS IDENTITY约束

要从当前表中删除GENERATED AS IDENTITY约束,我们将使用以下语法:
删除生成的AS身份约束的语法
下图用于从指定表中删除生成的身份约束:
ALTER TABLE table_name 
ALTER COLUMN column_name 
DROP IDENTITY [ if EXISTS ] 
让我们看一个示例,该示例显示了删除 Generated AS Identity Constraint的工作。
在以下命令中,我们将删除GENERATED AS IDENTITY约束列从 结构 表的 Str_id 列中:
ALTER TABLE Structure
ALTER COLUMN Str_id
DROP IDENTITY if EXISTS;
输出
执行上述命令后,我们将获得以下消息窗口,其中显示了 GENERATED AS IDENTITY约束 Structure 表已成功删除。
PostgreSQL标识列
我们将再次使用以下命令检查 结构 Str_id 列中的 GENERATED AS IDENTITY约束列strong>表是否已成功删除或未在SQL Shell(PSQL)中删除:
\d structure 
输出
执行上述命令后,我们将得到以下结果,该结果显示 GENERATED AS IDENTITY约束列已被执行。从 Structure 表中删除。
PostgreSQL标识列

概述

PostgreSQL自增列部分中,我们学习了以下主题:
我们通过使用 GENERATED AS IDENTITY 了解了 PostgreSQL自增列的工作原理。 我们已经看到了"始终生成的"约束和" <默认生成的身份标识"约束的示例。< strong> 我们了解了顺序选项的工作以及一些示例示例。 我们还可以在ALTER TABLE命令的帮助下将标识列添加到现有表中。 在本节中,我们还了解如何使用ALTER TABLE命令修改Identity列。 我们使用了 ALTER TABLE 命令删除了GENERATED AS IDENTITY约束。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4