

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

`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

where action is one of:

    ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type
    ADD table_constraint_using_index
    ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]
    ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]
    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-identity-columns"></a>

**`SET GENERATED { ALWAYS | BY DEFAULT }` / `SET {{sequence_option}}` / `RESTART`**  
这些格式更改列是否为标识列，或更改现有标识列的生成属性。有关详细信息，请参阅 [`CREATE TABLE`](create-table-syntax-support.md)。比如 `SET DEFAULT`，这些格式只影响后续 `INSERT` 和 `UPDATE` 命令的行为；它们不会导致表中已有的行发生变化。  
{{sequence\_option}} 是 [`ALTER SEQUENCE`](alter-sequence-syntax-support.md)（如 `INCREMENT BY`）支持的选项。这些格式更改现有标识列所基于的序列。

**`DROP IDENTITY [ IF EXISTS ]`**  
此格式从列中移除标识属性。如果指定了 `DROP IDENTITY IF EXISTS` 并且该列不是标识列，则不会引发任何错误。在这种情况下，将改为发出通知。

## 添加约束操作
<a name="alter-table-add-constraint"></a>

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