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 命令中使用。

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

列定义中的 ALWAYS 和 BY DEFAULT 子句决定了在 INSERT 和 UPDATE 命令中如何显式处理用户指定的值。在 INSERT 命令中,如果选择 ALWAYS,则只有在 INSERT 语句指定了 OVERRIDING SYSTEM VALUE 时,才会接受用户指定的值。如果选择 BY DEFAULT,则用户指定的值具有优先权。因此,使用 BY DEFAULT 会产生与默认值更相似的行为,其中默认值可以被显式值覆盖,而 ALWAYS 对意外插入显式值提供了一些额外的保护。

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

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

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

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