9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

5.3. 标识列 #

标识列是一种特殊的列,它是从隐式序列自动生成的。它可以用来生成键值。

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

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');

会为id列生成从1开始的值,并产生如下表数据:

 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期间, 如果语句中指定的表中某列是标识列,则该列被视为标识列,并应用相应的标识属性。

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