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 数据库中。
成功创建
Vegetable 表后,我们将在INSERT命令的帮助下向其中插入一些值。
INSERT INTO Vegetable(veggie_name)
VALUES ('Sweet Potato');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示一个值已成功插入
Vemtable 表。
我们知道
Veggie_id 列具有
GENERATED AS IDENTITY约束,这就是PostgreSQL为它创建一个值的原因,正如我们在以下命令中看到的那样:
输出
成功执行上述命令后,我们将获得以下输出,其中显示了
Vegetable中的所有数据 表:
现在,我们将插入一个新的通过提供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 表。
注意: 我们可以使用GENERATED BY DEFAULT AS IDENTITY代替其"始终以身份生成"。
通过默认身份生成的示例
让我们看一下示例示例,以了解
默认情况下如何以身份生成 >有效。
Step1
首先,我们将
Vegetable 表删除并重建它通过使用
默认身份生成的代替
始终身份生成的:
输出
执行上述命令后,我们将获得以下消息窗口,其中显示
Vegetable 表已成功删除。
Step2
现在,我们将使用GENERATED BY DEFAULT AS IDENTITY创建一个类似的表,如以下命令所示:
CREATE TABLE Vegetable (
Veggie_id int GENERATED BY default AS IDENTITY,
Veggie_name VARCHAR NOT null
);
输出
执行上述命令时,我们将获得以下消息窗口,其中显示
Vegetable 表已成功创建。
Step3
再次成功创建
Vegetable表后,我们将使用
INSERT 命令向其中插入一些值,如下所示:
INSERT INTO Vegetable(Veggie_name)
VALUES('Onion');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示一个值已成功插入
Vegetable 表。
步骤4
此后,我们将更多值插入具有
Veggie_id 的
Vegetable 表中如以下命令所示:
INSERT INTO Vegetable(Veggie_id, Veggie_name)
VALUES(2, 'Cabbage'),
(3, 'Broccoli'),
(4, 'Tomato'),
(5, 'Avocado');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示四个值已成功插入
Vegetable 表。
注意: 如果我们同时比较两个命令,可以看到使用GENERATED ALWAYS AS IDENTITY约束发生错误,而GENERATED BY DEFAULT AS IDENTITY约束成功执行并且没有提高任何错误。
序列选项示例
我们可以为系统生成的值定义
序列选项,因为
GENERATED AS IDENTITY 约束使用SEQUENCE对象。
让我们看一个示例来了解Sequence选项的工作。
在下面的命令中,我们描述了起始值和增量值,如下所示:
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定表已成功
删除
现在,我们将创建相同的表(
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 数据库中。
在上述命令中,
Veggie_id 列的
系统生成的值以
5 和
增量值也是
5 。
现在,我们将在帮助下将新值插入
Vegetable 表中
INSERT 命令:
INSERT INTO Vegetable(Veggie_name)
VALUES('Pumpkin');
输出
执行上述命令后,我们将获得以下输出:
创建和ins之后输入
Vegetable 表的值时,我们将使用
SELECT 命令返回
Vegetable表的所有行:
输出
成功执行上述命令后,我们将获得以下输出,其中显示
Veggie_id的起始值 列为
5 :
成功执行以上命令后,我们将在
Vegetable 表中插入更多行:
INSERT INTO Vegetable(Veggie_name)
VALUES('Zucchini'),
('White Button Mushroom'),
('Cauliflower');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定的值已成功插入
Vegetable 表。
第二行的
Veggie_id 是10,因为我们在创建
Vegetable 表时使用了
increment 选项:
输出
成功执行以上命令后,我们将获得以下输出,该输出显示
Vegetable中的所有现有数据。 表:
添加自增列到当前表中
我们可以借助以下 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 数据库中。
第2步: 将Str_id列修改为Identity列
在以下命令中,我们将使用ALTER Table命令将
Str_id 列更改为自增列:
ALTER TABLE Structure
ALTER COLUMN Str_id ADD GENERATED ALWAYS AS IDENTITY;
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示"结构"表已成功更改。
注意: 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
输出
执行上述命令后,我们将获得以下输出:
现在,我们将在 Organization 中输入以下命令来描述"结构"表
输出
在执行上述命令时,我们将检索以下输出,这是我们从
Structure 预期的输出表:
更改标识列
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 >表已成功
修改。
描述psql中的
Structure 表的设计;我们将使用与上面类似的命令:
输出
执行上面的语句后,我们将获得以下输出,这表明
Str_id 列已从
始终生成到
默认生成。
删除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 表已成功删除。
我们将再次使用以下命令检查
结构 的
Str_id 列中的
GENERATED AS IDENTITY约束列strong>表是否已成功删除或未在SQL Shell(PSQL)中删除:
输出
执行上述命令后,我们将得到以下结果,该结果显示
GENERATED AS IDENTITY约束列已被执行。从
Structure 表中删除。
概述
在
PostgreSQL自增列部分中,我们学习了以下主题:
我们通过使用 GENERATED AS IDENTITY 了解了 PostgreSQL自增列的工作原理。
我们已经看到了"始终生成的"约束和"
<默认生成的身份标识"约束的示例。< strong>
默认生成的身份标识"约束的示例。<>
我们了解了顺序选项的工作以及一些示例示例。
我们还可以在ALTER TABLE命令的帮助下将标识列添加到现有表中。
在本节中,我们还了解如何使用ALTER TABLE命令修改Identity列。
我们使用了 ALTER TABLE 命令删除了GENERATED AS IDENTITY约束。