标识列
重要
使用标识列时,应谨慎考虑缓存值。有关更多信息,请参阅 CREATE SEQUENCE 页面上的“重要提示”标注。
有关如何根据工作负载模式以最佳方式使用标识列的指导,请参阅使用序列和标识列。
标识列是根据隐式序列自动生成的特殊列。它可以用来生成键值。要创建标识列,请在 CREATE TABLE 中使用 GENERATED ... AS IDENTITY 子句,例如:
CREATE TABLE people ( id bigint GENERATED ALWAYS AS IDENTITY (CACHE 70000), ... );
或者:
CREATE TABLE people ( id bigint GENERATED BY DEFAULT AS IDENTITY (CACHE 70000), ... );
有关更多信息,请参阅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');
同样,可以在 UPDATE 命令中使用关键字 DEFAULT。
这样,在许多方面,标识列的行为类似于具有默认值的列。
列定义中的子句 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 约束来强制实施唯一性。