View a markdown version of this page

标识列 - Amazon Aurora DSQL

标识列

重要

使用标识列时,应谨慎考虑缓存值。有关更多信息,请参阅 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

这样,在许多方面,标识列的行为类似于具有默认值的列。

列定义中的子句 ALWAYSBY DEFAULT 决定了在 INSERTUPDATE 命令中如何显式处理用户指定的值。在 INSERT 命令中,如果选择了 ALWAYS,则只有在 INSERT 语句指定 OVERRIDING SYSTEM VALUE 时才接受用户指定的值。如果选择了 BY DEFAULT,则优先使用用户指定的值。因此,使用 BY DEFAULT 会产生更类似于使用默认值时的行为,其中,默认值可以由显式值覆盖,而 ALWAYS 可提供更多保护,以防止意外插入显式值。

标识列的数据类型必须为序列支持的数据类型之一。(请参见 CREATE SEQUENCE。) 关联序列的属性可以在创建标识列时指定(请参阅 CREATE TABLE),也可以在之后更改(请参阅 ALTER TABLE)。

标识列会自动标记为 NOT NULL。但是,身份列并不能保证唯一性。(序列通常返回唯一值,但可以重置序列,也可以手动将值插入标识列中,如前面所述。) 需要使用 PRIMARY KEYUNIQUE 约束来强制实施唯一性。