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