📅  最后修改于: 2020-11-30 01:28:49             🧑  作者: Mango
在本节中,我们将了解PostgreSQL IDENTITY和GENERATED约束的工作原理,该约束用于生成特定列的PostgreSQL Identity列,以及更改Identity列的示例,并通过示例了解Sequence选项的工作。
我们还将看到在当前表中添加标识列并修改标识列以使用ALTER TABLE命令删除GENERATED AS IDENTITY约束的示例。
从PostgreSQL版本10开始,PostgreSQL开发人员宣布了一个称为GENERATED AS IDENTITY的新约束,该约束用于自动为列分配唯一编号。
PostgreSQL GENERATED AS IDENTITY约束的语法如下:
column_name type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]
在上面的语法中,我们有以下几点,在实时示例中使用时需要记住:
让我们看不同的示例,以了解PostgreSQL身份列的工作方式。
我们将在CREATE命令的帮助下创建一个新表,作为Vegetable ,并使用INSERT命令插入一些值。
要将菜品创建到组织数据库中,我们使用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数据库中。
蔬菜表成功创建后,我们将在INSERT命令的帮助下向其中插入一些值。
INSERT INTO Vegetable(veggie_name)
VALUES ('Sweet Potato');
输出量
实施上述命令后,我们将获得以下消息窗口,该窗口显示一个值已成功插入到Vegetable表中。
我们知道Veggie_id列具有GENERATED AS IDENTITY约束,这就是PostgreSQL为它创建一个值的原因,如下面的命令所示:
SELECT * FROM Vegetable;
输出量
成功执行上述命令后,我们将获得以下输出,其中显示了Vegetable表中存在的所有数据:
现在,我们将通过提供Veggie_id和Veggie_name列的值来插入新行:
INSERT INTO Vegetable(Veggie_id, Veggie_name)
VALUES (2,'Carrot');
输出量
执行完上述命令后,Postgresql引发以下错误:我们无法将值插入veggie_id列,因为Veggie_id列是一个标识列,并描述为GENERATED ALWAYS。
我们可以使用OVERRIDING SYSTEM VALUE子句在以下命令中解决以上错误:
INSERT INTO Vegetable(Veggie_id, Veggie_name)
OVERRIDING SYSTEM VALUE
VALUES(2, 'Carrot');
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定的值已成功插入到Vegetable表中。
注意:可以使用GENERATED BY DEFAULT AS IDENTITY代替其始终生成的身份。
让我们看示例示例,以了解默认情况下作为身份生成的方式。
步骤1
首先,我们将删除Vegetable表,并使用GENERATED BY DEFAULT AS IDENTITY来代替它的GENERATED ALWAYS AS IDENTITY :
DROP TABLE Vegetable;
输出量
执行完上述命令后,我们将获得以下消息窗口,该窗口显示蔬菜表已成功删除。
第2步
现在,我们将使用GENERATED BY DEFAULT AS IDENTITY创建一个类似的表,如以下命令所示:
CREATE TABLE Vegetable (
Veggie_id INT GENERATED BY DEFAULT AS IDENTITY,
Veggie_name VARCHAR NOT NULL
);
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示蔬菜表已成功创建。
第三步
再次成功创建Vegetable表之后,我们将使用INSERT命令将一些值插入其中,如下所示:
INSERT INTO Vegetable(Veggie_name)
VALUES('Onion');
输出量
实施上述命令后,我们将获得以下消息窗口,该窗口显示一个值已成功插入到Vegetable表中。
第四步
然后,我们将更多的值插入具有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选项的工作。
在下面的命令中,我们描述了起始值和增量值,如下所示:
DROP TABLE Vegetable;
输出量
执行完上述命令后,我们将获得以下消息窗口,该窗口显示指定的表已成功删除。
现在,我们将再次创建相同的表( Vegetable ),但是这次,我们使用Start和Increment参数,如以下命令所示:
CREATE TABLE Vegetable (
Veggie_id INT GENERATED BY DEFAULT AS IDENTITY
(START WITH 5 INCREMENT BY 5),
Veggie_name VARCHAR NOT NULL);
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示蔬菜表已成功创建到组织数据库中。
在上面的命令中, Veggie_id列的系统生成的值以5开头,增量值也为5 。
现在,我们将在INSERT命令的帮助下将新值插入Vegetable表:
INSERT INTO Vegetable(Veggie_name)
VALUES('Pumpkin');
输出量
执行上述命令后,我们将获得以下输出:
创建并插入蔬菜表的值之后,我们将使用SELECT命令返回蔬菜表的所有行:
SELECT * FROM Vegetable;
输出量
在成功执行上述命令,我们会得到以下输出,其显示用于Veggie_id列的起始值是5:
成功执行以上命令后,我们将在Vegetable表中插入更多行:
INSERT INTO Vegetable(Veggie_name)
VALUES('Zucchini'),
('White Button Mushroom'),
('Cauliflower');
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示指定的值已成功插入到Vegetable表中。
第二行的Veggie_id的值为10,因为我们在创建蔬菜表时使用了增量选项:
SELECT * FROM Vegetable;
输出量
成功执行上述命令后,我们将获得以下输出,该输出显示蔬菜表中的所有现有数据:
我们可以借助ALTER TABLE命令的以下语法将标识列添加到当前表中:
向当前表添加标识列的语法
下图用于将标识列添加到现有表:
ALTER TABLE table_name
ALTER COLUMN column_name
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY { ( sequence_option ) }
让我们看一个示例示例,以了解以下内容:
要将标识列添加到现有表中,我们必须执行以下步骤:
我们将在CREATE命令的帮助下创建一个新表作为Structure。
要将结构创建到组织数据库中,我们使用CREATE命令。
Purchase_details表包含两列,例如Str_id和Str_name
CREATE TABLE Structure (
Str_id INT NOT NULL,
Str_name VARCHAR NOT NULL
);
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示“结构”表已成功创建到“组织”数据库中。
在以下命令中,我们将使用ALTER Table命令将Str_id列更改为identity列:
ALTER TABLE Structure
ALTER COLUMN Str_id ADD GENERATED ALWAYS AS IDENTITY;
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示Structure表已成功更改。
注意: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)工具中描述结构表,我们可以使用以下命令,但是在使用describe命令之前,我们将遵循以下过程:
postgres=# \c Organization
输出量
执行上述命令后,我们将获得以下输出:
\d Structure
输出量
在执行上述命令时,我们将检索以下输出,这是我们从“结构”表中获得的结果:
ALTER TABLE命令还用于更改当前标识列的功能,如下图所示:
更改标识列的语法
以下语法用于更改标识列:
Alter table table_name
Alter column column_name
{ SET GENERATED { ALWAYS| BY DEFAULT } |
SET sequence_option | RESTART [ [ WITH] restart ] }
让我们看一个示例示例,以更好地了解如何使用ALTER TABLE命令更改标识列:
在下面的命令中,我们使用GENERATED BY DEFAULT约束修改了Structure表的Str_id列:
ALTER TABLE Structure
ALTER COLUMN Str_id SET GENERATED BY DEFAULT;
输出量
执行上述命令后,我们将获得以下消息窗口,显示“结构”表已成功修改。
并在psql中描述Structure表的设计;我们将使用上面类似的命令:
\d Structure
输出量
执行完上面的语句后,我们将获得以下输出,该结果表明Str_id列已从GENERATED ALWAYS修改为GENERATED BY DEFAULT 。
要从当前表中删除GENERATED AS IDENTITY约束,我们将使用以下语法:
删除生成的AS身份约束的语法
下图用于从指定表中删除“生成为身份约束”:
ALTER TABLE table_name
ALTER COLUMN column_name
DROP IDENTITY [ IF EXISTS ]
让我们看一个示例,该示例显示了删除生成的AS身份约束的工作。
在以下命令中,我们将从“结构”表的Str_id列中删除“ GENERATED AS IDENTITY”约束列:
ALTER TABLE Structure
ALTER COLUMN Str_id
DROP IDENTITY IF EXISTS;
输出量
执行上述命令后,我们将获得以下消息窗口,该窗口显示已成功删除“结构”表的“ GENERATED AS IDENTITY”约束列。
我们将再次使用以下命令来检查是否已成功删除SQL Shell(PSQL)中的Structure表的Str_id列中的GENERATED AS IDENTITY约束列:
\d structure
输出量
实施上述命令后,我们将得到以下结果,该结果显示GENERATED AS IDENTITY约束列已从结构表中删除。
在“ PostgreSQL身份列”部分中,我们学习了以下主题: