📜  PostgreSQL – 身份列

📅  最后修改于: 2022-05-13 01:57:14.753000             🧑  作者: Mango

PostgreSQL – 身份列

在 PostgreSQL 中,GENERATED AS IDENTITY 约束用于创建 PostgreSQL 标识列。它允许用户自动为列分配唯一值。 GENERATED AS IDENTITY 约束是 PostgreSQL 的 SERIAL 列的符合 SQL 标准的变体。

Syntax:
column_name type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]

我们来分析一下上面的语法。

  • 类型可以是 SMALLINT、INT 或 BIGINT。
  • GENERATED ALWAYS 指示 PostgreSQL 始终为标识列生成一个值。如果您尝试将值插入(或更新)到 GENERATED ALWAYS AS IDENTITY 列中,PostgreSQL 将发出错误。
  • GENERATED BY DEFAULT 还指示 PostgreSQL 为标识列生成一个值。但是,如果您为插入或更新提供值,PostgreSQL 将使用该值插入标识列,而不是使用系统生成的值。

现在让我们看一些例子。

示例 1:
首先,创建一个名为color color_id作为标识列:

CREATE TABLE color (
    color_id INT GENERATED ALWAYS AS IDENTITY,
    color_name VARCHAR NOT NULL
);

color表中插入一个新行:



INSERT INTO color (color_name)
VALUES
    ('Red');

因为 color_id 列具有 GENERATED AS IDENTITY 约束,PostgreSQL 为它生成一个值,如下面的查询所示:

SELECT * FROM color;

这将导致以下结果:

第三,通过为 color_id 和 color_name 列提供值来插入新行:

INSERT INTO color (color_id, color_name)
VALUES
    (2, 'Green');

PostgreSQL 发出以下错误:

[Err] ERROR:  cannot insert into column "color_id"
DETAIL:  Column "color_id" is an identity column defined as GENERATED ALWAYS.
HINT:  Use OVERRIDING SYSTEM VALUE to override.


要修复错误,在这种情况下,您可以使用 OVERRIDING SYSTEM VALUE 子句,如下所示:

INSERT INTO color (color_id, color_name)
OVERRIDING SYSTEM VALUE 
VALUES
    (2, 'Green');

现在,如果我们使用以下语句来验证条目:

SELECT * FROM color;

输出:

示例 2:
在这个例子中,我们将使用 GENERATED BY DEFAULT AS IDENTITY 来创建我们上面创建的同一个表。为此,请删除颜色表,如下所示:

DROP TABLE color;

现在重新创建表如下:

CREATE TABLE color (
    color_id INT GENERATED BY DEFAULT AS IDENTITY,
    color_name VARCHAR NOT NULL
);

现在,在颜色表中插入一行:

INSERT INTO color (color_name)
VALUES
    ('White');

现在,插入带有 color_id 列值的另一行:

INSERT INTO color (color_id, color_name)
VALUES
    (2, 'Yellow');

与前面使用 GENERATED ALWAYS AS IDENTITY 约束的示例不同,此语句也适用。
要验证插入的数据,请使用以下语句:

SELECT * FROM color;

输出: