📜  PostgreSQL身份列

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

PostgreSQL身份栏

在本节中,我们将了解PostgreSQL IDENTITY和GENERATED约束的工作原理,该约束用于生成特定列的PostgreSQL Identity列,以及更改Identity列的示例,并通过示例了解Sequence选项的工作。

我们还将看到在当前表中添加标识列并修改标识列以使用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,INTBIGINT
  • GENERATED ALWAYS通常用于要求PostgreSQL为身份列不断创建一个值。
  • 如果我们尝试更新值或将其值插入GENERATED ALWAYS AS IDENTITY列, PostgreSQL将发生错误。
  • 但是,如果我们提供一个用于插入或更新的值,则GENERATED BY DEFAULT用于告诉PostgreSQL为标识列创建一个值。
  • 为了使用系统生成的值,PostgreSQL将使用特定的值插入identity列。

PostgreSQL身份列示例

让我们看不同的示例,以了解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 ) }

让我们看一个示例示例,以了解以下内容:

要将标识列添加到现有表中,我们必须执行以下步骤:

步骤1:创建一个新表

我们将在CREATE命令的帮助下创建一个新表作为Structure。

要将结构创建到组织数据库中,我们使用CREATE命令。

Purchase_details表包含两列,例如Str_id和Str_name

CREATE TABLE Structure (
    Str_id INT NOT NULL,
    Str_name VARCHAR NOT NULL
);

输出量

执行上述命令后,我们将获得以下消息窗口,该窗口显示“结构”表已成功创建到“组织”数据库中。

步骤2:将Str_id列修改为标识列

在以下命令中,我们将使用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)

为了在SQL Shell(psql)工具中描述结构表,我们可以使用以下命令,但是在使用describe命令之前,我们将遵循以下过程:

  • 首先,我们将在本地系统中打开psql ,然后连接到要创建表的数据库。
  • 为了连接组织数据库,我们将输入以下命令:
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

删除生成的AS身份约束

要从当前表中删除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身份列”部分中,我们学习了以下主题:

  • 我们通过使用GENERATED AS IDENTITY学习了PostgreSQL身份列的工作
  • 我们已经看到了GENERATED ALWAYS约束GENERATED BY DEFAULT AS IDENTITY约束的示例。
  • 我们通过一些示例示例了解了Sequence选项的工作方式。
  • 我们还可以在ALTER TABLE命令的帮助下将标识列添加到现有表中。
  • 在本节中,我们还将了解如何使用ALTER TABLE命令修改Identity列。
  • 我们使用ALTER TABLE命令删除GENERATED AS IDENTITY约束。