View a markdown version of this page

ALTER TABLE - Amazon Aurora DSQL

ALTER TABLE

ALTER TABLE 更改表的定义。

支持的语法

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME [ COLUMN ] column_name TO new_column_name ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME CONSTRAINT constraint_name TO new_constraint_name ALTER TABLE [ IF EXISTS ] name RENAME TO new_name ALTER TABLE [ IF EXISTS ] name SET SCHEMA new_schema ALTER TABLE ASYNC [ IF EXISTS ] [ ONLY ] name [ * ] VALIDATE CONSTRAINT constraint_name where action is one of: ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] ALTER [ COLUMN ] column_name SET DEFAULT expression ALTER [ COLUMN ] column_name DROP DEFAULT ALTER [ COLUMN ] column_name DROP NOT NULL ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...] ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ADD table_constraint NOT VALID ADD table_constraint_using_index DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } and table_constraint is: [ CONSTRAINT constraint_name ] CHECK ( expression ) and table_constraint_using_index is: [ CONSTRAINT constraint_name ] UNIQUE USING INDEX index_name

说明

ADD [ COLUMN ] [ IF NOT EXISTS ]

此表单使用与 CREATE TABLE 相同的语法向表中添加一个新列。如果指定 IF NOT EXISTS 并且具有此名称的列已经存在,将不会引发任何错误。

DROP [ COLUMN ] [ IF EXISTS ]

此表单从表中删除一列。除了主键约束外,涉及该列的索引和表约束将被自动删除。不支持删除主键列。如果删除该列会导致统计数据仅包含单个列的数据,则引用该已删除列的多变量统计数据也将被删除。如果表外部的任何内容依赖于该列(例如外键引用或视图),则您需要指定 CASCADE。如果指定了 IF EXISTS 但该列不存在,则不会引发任何错误。在这种情况下,将改为发出通知。

SET/DROP DEFAULT

这些表单为列设置或移除默认值(其中,移除等同于将默认值设置为 NULL)。新的默认值将仅适用于后续 INSERTUPDATE 命令;它不会导致表中已有的行发生变化。

DROP NOT NULL

此表单将列更改为支持 null 值。

DROP EXPRESSION [ IF EXISTS ]

此表单将存储的生成列转换为普通的基列。列中的现有数据会保留,但未来的更改将不再应用生成表达式。如果指定了 DROP EXPRESSION IF EXISTS 并且该列不是生成的列,则不会引发任何错误。在这种情况下,将改为发出通知。

ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]

这些格式更改列是否为标识列,或更改现有标识列的生成属性。有关详细信息,请参阅CREATE TABLE。比如 SET DEFAULT,这些格式只影响后续 INSERTUPDATE 命令的行为;它们不会导致表中已有的行发生变化。

sequence_optionALTER SEQUENCE(如 INCREMENT BY)支持的选项。这些格式更改现有标识列所基于的序列。

注意

Amazon Aurora DSQL 在使用 ADD GENERATED AS IDENTITY 时需要一个显式 CACHE 值。此外,标识列仅在 bigint 列上受支持。

使用标识列时,应谨慎考虑缓存值。有关更多信息,请参阅 CREATE SEQUENCE 页面上的“重要提示”标注。

有关如何根据工作负载模式以最佳方式使用标识列的指导,请参阅使用序列和标识列

SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }

此形式用于设置列的存储模式。有关可用的存储模式的详细信息,请参阅 CREATE TABLE 页面上的存储模式

ADD table_constraint NOT VALID

此表单向表中添加一个新的 CHECK 约束。在 Aurora DSQL 中,通过 ALTER TABLE ADD CONSTRAINT 添加的 CHECK 约束必须使用 NOT VALID 选项。Aurora DSQL 会创建约束,但不会立即根据现有数据进行验证。这样可以在不扫描整个表的情况下添加约束。此约束会立即应用于所有新行和更新。

通过 NOT VALID 添加约束后,使用 ALTER TABLE ASYNC ... VALIDATE CONSTRAINT 验证现有数据是否也满足该约束。验证过程作为异步 DDL 作业运行。您可以使用 sys.jobs 监控该过程的进度。

ADD table_constraint_using_index

此格式基于现有的唯一索引,向表添加新的 UNIQUE 约束。索引的所有列都将包含在约束中。

索引必须处于 VALID 状态;不支持使用当前正在构建中的索引来添加唯一约束。

如果提供了约束名称,则索引将被重命名以匹配约束名称。否则,约束的命名将与索引相同。

执行此命令后,索引由约束“拥有”,这种拥有方式就像索引是由常规 CREATE UNIQUE INDEX ASYNC 命令构建一样。特别的地方在于,删除约束也会使索引消失。

VALIDATE CONSTRAINT

此表单用于验证以前使用 NOT VALID 选项创建的约束。此命令是一种异步 DDL 操作,不会阻止其它事务。当您运行 ALTER TABLE ASYNC ... VALIDATE CONSTRAINT 时,Aurora DSQL 立即返回 job_id

您可以使用 sys.jobs 系统视图来监控此异步作业的状态。您也可以使用 sys.wait_for_job('job_id') 阻塞当前会话,直到验证完成或失败。

验证作业会扫描整个表,以便验证所有现有行是否满足约束。验证操作成功完成后,Aurora DSQL 会将约束标记为有效,并且查询计划器会对所有查询强制执行该约束。如果由于现有行违反约束而导致验证失败,则作业会失败,而约束保持 NOT VALID 状态。

此命令只验证您使用 NOT VALID 选项创建的约束。尝试验证已生效的约束会导致出错。

DROP CONSTRAINT [ IF EXISTS ]

此表单会删除表上的指定约束以及该约束下的所有索引。如果指定了 IF EXISTS 但该约束不存在,则不会引发任何错误。在这种情况下,将改为发出通知。

OWNER TO

此表单将表的所有者更改为指定的用户。

RENAME

RENAME 表单更改表的名称、表中单个列的名称或表中约束的名称。重命名具有基础索引的约束时,也会重命名索引。对存储的数据没有任何影响。

SET SCHEMA

此表单将表移到另一个架构中。表列所拥有的关联索引、约束和序列也会移动。

参数

IF EXISTS

如果表不存在,不引发错误。在这种情况下,将发出通知。

name

要更改的现有表的名称(可选择架构限定)。如果在表名之前指定了 ONLY,则仅更改该表。如果未指定 ONLY,则会更改该表及其所有子代表(如果有)。(可选)可以在表名后指定 *,以显式表示包含子代表。

column_name

新列或现有列的名称。

new_column_name

现有列的新名称。

new_name

表的新名称。

data_type

新列的数据类型。

table_constraint

CHECK 约束定义。在 Aurora DSQL 中,必须使用 ALTER TABLE ADD CONSTRAINTNOT VALID 选项来添加 CHECK 约束。有关完整的 CHECK 约束语法,请参阅 CREATE TABLE

constraint_name

新约束或现有约束的名称。

CASCADE

自动删除依赖于已删除列或已删除约束的对象(例如,引用该列的视图),进而删除依赖于这些对象的所有对象。

RESTRICT

如果存在任何依赖对象,则拒绝删除这样的列或约束。这是默认行为。

new_owner

表的新所有者的用户名。

new_schema

表将移动到的架构的名称。

备注

DROP COLUMN 表单不会实际删除该列,只是使该列对 SQL 操作不可见。该表中的后续插入和更新操作将为该列存储 null 值。因此,删除列的速度很快,但不会立即减少您的表的磁盘大小,因为已删除列占用的空间不会被回收。随着时间推移,现有行发生更新,此时占用的空间将被回收。

如果已删除列作为主键中的 INCLUDE 列被引用,则主键定义将会更新,以移除已删除的列。

Aurora DSQL 中的表一次最多可以有 255 个活动列,在表的整个生命周期内最多可以有 1600 个列。删除列时,不会回收其属性编号,而是将属性编号从活动列集内删除,但已删除的列仍会计入 1600 个列的生命周期限制。有关更多信息,请参阅 Aurora DSQL 中的数据库限制