

# `ALTER TABLE`
<a name="alter-table-syntax-support"></a>

`ALTER TABLE` 更改表的定义。

## 支持的语法
<a name="alter-table-supported-syntax"></a>

```
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

where action is one of:

    ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ]
    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_using_index
    DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }

and table_constraint_using_index is:

    [ CONSTRAINT constraint_name ]
    UNIQUE USING INDEX index_name
```

## 说明
<a name="alter-table-description"></a>

**`ADD [ COLUMN ] [ IF NOT EXISTS ]`**  
此表单使用与 [`CREATE TABLE`](create-table-syntax-support.md) 相同的语法向表中添加一个新列。如果指定 `IF NOT 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 IDENTITY``SET GENERATED { ALWAYS | BY DEFAULT }``DROP IDENTITY [ IF EXISTS ]`**  
这些格式更改列是否为标识列，或更改现有标识列的生成属性。有关详细信息，请参阅[`CREATE TABLE`](create-table-syntax-support.md)。比如 `SET DEFAULT`，这些格式只影响后续 `INSERT` 和 `UPDATE` 命令的行为；它们不会导致表中已有的行发生变化。  
{{sequence\_option}} 是 [`ALTER SEQUENCE`](alter-sequence-syntax-support.md)（如 `INCREMENT BY`）支持的选项。这些格式更改现有标识列所基于的序列。  
Amazon Aurora DSQL 在使用 `ADD GENERATED AS IDENTITY` 时需要一个显式 `CACHE` 值。此外，标识列仅在 `bigint` 列上受支持。  
使用标识列时，应谨慎考虑缓存值。有关更多信息，请参阅 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 页面上的“重要提示”标注。  
有关如何根据工作负载模式以最佳方式使用标识列的指导，请参阅[使用序列和标识列](sequences-identity-columns-working-with.md)。

**`SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }`**  
此形式用于设置列的存储模式。有关可用的存储模式的详细信息，请参阅 [`CREATE TABLE`](create-table-syntax-support.md) 页面上的[存储模式](create-table-syntax-support.md#create-table-storage)。

**`ADD {{table_constraint_using_index}}`**  
此格式基于现有的唯一索引，向表添加新的 `UNIQUE` 约束。索引的所有列都将包含在约束中。  
索引必须处于 `VALID` 状态；不支持使用当前正在构建中的索引来添加唯一约束。  
如果提供了约束名称，则索引将被重命名以匹配约束名称。否则，约束的命名将与索引相同。  
执行此命令后，索引由约束“拥有”，这种拥有方式就像索引是由常规 `CREATE UNIQUE INDEX ASYNC` 命令构建一样。特别的地方在于，删除约束也会使索引消失。

**`DROP CONSTRAINT [ IF EXISTS ]`**  
此表单会删除表上的指定约束以及该约束下的所有索引。如果指定了 `IF EXISTS` 但该约束不存在，则不会引发任何错误。在这种情况下，将改为发出通知。  
目前，`CREATE TABLE` 表达式支持添加新约束。`ALTER TABLE ADD CONSTRAINT`（对 `DROP CONSTRAINT` 的镜像支持）尚不可用。如果您对这项即将推出的功能有任何疑问，请联系 AWS Support 或直接通过 [DSQL Public Discord](https://discord.com/invite/nEF6ksFWru) 联系我们。

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

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

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

## 参数
<a name="alter-table-parameters"></a>

**`IF EXISTS`**  
如果表不存在，不引发错误。在这种情况下，将发出通知。

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

**{{column\_name}}**  
新列或现有列的名称。

**{{new\_column\_name}}**  
现有列的新名称。

**{{new\_name}}**  
表的新名称。

**{{data\_type}}**  
新列的数据类型。

**{{constraint\_name}}**  
新约束或现有约束的名称。

**`CASCADE`**  
自动删除依赖于已删除约束的对象（例如，引用该列的视图），进而删除依赖于这些对象的所有对象。

**`RESTRICT`**  
如果存在任何依赖对象，则拒绝删除约束。这是默认行为。

**{{new\_owner}}**  
表的新所有者的用户名。

**{{new\_schema}}**  
表将移动到的架构的名称。