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)。新的默认值将仅适用于后续
INSERT或UPDATE命令;它不会导致表中已有的行发生变化。 DROP NOT NULL-
此表单将列更改为支持 null 值。
DROP EXPRESSION [ IF EXISTS ]-
此表单将存储的生成列转换为普通的基列。列中的现有数据会保留,但未来的更改将不再应用生成表达式。如果指定了
DROP EXPRESSION IF EXISTS并且该列不是生成的列,则不会引发任何错误。在这种情况下,将改为发出通知。 ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITYSET GENERATED { ALWAYS | BY DEFAULT }DROP IDENTITY [ IF EXISTS ]-
这些格式更改列是否为标识列,或更改现有标识列的生成属性。有关详细信息,请参阅CREATE TABLE。比如
SET DEFAULT,这些格式只影响后续INSERT和UPDATE命令的行为;它们不会导致表中已有的行发生变化。sequence_option是 ALTER SEQUENCE(如INCREMENT BY)支持的选项。这些格式更改现有标识列所基于的序列。注意
Amazon Aurora DSQL 在使用
ADD GENERATED AS IDENTITY时需要一个显式CACHE值。此外,标识列仅在bigint列上受支持。使用标识列时,应谨慎考虑缓存值。有关更多信息,请参阅 CREATE SEQUENCE 页面上的“重要提示”标注。
有关如何根据工作负载模式以最佳方式使用标识列的指导,请参阅使用序列和标识列。
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }-
此形式用于设置列的存储模式。有关可用的存储模式的详细信息,请参阅 CREATE TABLE 页面上的存储模式。
ADDtable_constraintNOT VALID-
此表单向表中添加一个新的
CHECK约束。在 Aurora DSQL 中,通过ALTER TABLE ADD CONSTRAINT添加的CHECK约束必须使用NOT VALID选项。Aurora DSQL 会创建约束,但不会立即根据现有数据进行验证。这样可以在不扫描整个表的情况下添加约束。此约束会立即应用于所有新行和更新。通过
NOT VALID添加约束后,使用ALTER TABLE ASYNC ... VALIDATE CONSTRAINT验证现有数据是否也满足该约束。验证过程作为异步 DDL 作业运行。您可以使用sys.jobs监控该过程的进度。 ADDtable_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 CONSTRAINT的NOT 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 中的数据库限制。