Redrock Postgres 搜索 英文
版本: 17

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) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar');

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

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

或者,关键字 DEFAULT 可以指定在值的旁边,以明确请求序列生成的值,例如

INSERT INTO people (id, name, address) VALUES (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 期间,如果一个列在语句中命名的表中是标识列,则该列被视为标识列,且应用相应的标识属性。

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