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;
输出: