↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17
开发中的版本: 19 / 20devel
开发快照。 PostgreSQL 20devel 尚未正式发布,内容仍可能变化。

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

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

 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 期间,只要语句中指定的那个表里该列是标识列,该列就会被当作标识列处理,并应用相应的标识属性。

分区会从分区表继承标识列。它们不能拥有自己的标识列。某个标识列的属性在整个分区层次中的所有分区上都保持一致。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.