标识列是一种特殊的列,它从隐式序列自动生成。它可以用来生成键值。
要创建标识列,请在 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 期间,如果列是语句中指定的表中的标识列,则该列被视为标识列,并且应用相应的标识属性。
分区从分区表继承标识列。它们不能拥有自己的标识列。给定标识列的属性在分区层次结构中的所有分区中保持一致。
如果您在文档中看到任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表格报告文档问题。