2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17)
开发版本:devel

5.3. 标识列 #

标识列是一种特殊类型的列,它会自动从隐式序列中生成。它可用于生成键值。

若要创建标识列,请在 CREATE TABLE 中使用 GENERATED ... AS IDENTITY 子句,例如

CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY,
    ...,
);

或者

CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    ...,
);

有关更多详细信息,请参阅 CREATE TABLE

如果在包含标识列的表上执行 INSERT 命令,并且未为标识列显式指定值,则会插入由隐式序列生成的的值。例如,使用上述定义并假设有其他合适的列,编写

INSERT INTO people (name, address) VALUE ('A', 'foo');
INSERT INTO people (name, address) VALUE ('B', 'bar');

将从 1 开始为 id 列生成值,并生成以下表格数据

 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar

或者,可以在值位置指定关键字 DEFAULT 以显式请求序列生成的的值,例如

INSERT INTO people (id, name, address) VALUE (DEFAULT, 'C', 'baz');

同样,关键字 DEFAULT 可用于 UPDATE 命令。

因此,在许多方面,标识列的行为类似于具有默认值的列。

列定义中的 ALWAYSBY DEFAULT 子句决定在 INSERTUPDATE 命令中如何处理用户显式指定的值。在 INSERT 命令中,如果选择了 ALWAYS,则只有当 INSERT 语句指定 OVERRIDING SYSTEM VALUE 时才会接受用户指定的值。如果选择了 BY DEFAULT,则用户指定的值将优先。因此,使用 BY DEFAULT 会导致行为更类似于默认值,其中默认值可以通过显式值覆盖,而 ALWAYS 提供了一些针对意外插入显式值的保护。

标识列的数据类型必须是序列支持的数据类型之一。(请参阅 CREATE SEQUENCE。)在创建标识列时可以指定关联序列的属性(请参阅 CREATE TABLE),或者之后更改(请参阅 ALTER TABLE)。

标识列会自动标记为 NOT NULL。但是,标识列不能保证唯一性。(序列通常返回唯一的值,但序列可以重置,或者可以手动将值插入标识列,如上所述。)唯一性需要使用 PRIMARY KEYUNIQUE 约束来强制执行。

在表继承层次结构中,子表中的标识列及其属性与其父表中的属性是独立的。子表不会自动从父表继承标识列或其属性。在 INSERTUPDATE 期间,如果该列是在语句中命名的表中的标识列,则该列将被视为标识列,并应用相应的标识属性。

分区从分区表继承标识列。它们不能拥有自己的标识列。给定标识列的属性在分区层次结构中的所有分区中保持一致。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。