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