### 15.12.1 在线 DDL 操作

[](<>)

本节的以下主题下提供了 DDL 操作的在线支持详细信息、语法示例和使用说明。

-   [索引操作](innodb-online-ddl-operations.html#online-ddl-index-operations)

-   [主键操作](innodb-online-ddl-operations.html#online-ddl-primary-key-operations)

-   [列操作](innodb-online-ddl-operations.html#online-ddl-column-operations)

-   [生成的列操作](innodb-online-ddl-operations.html#online-ddl-generated-column-operations)

-   [外键操作](innodb-online-ddl-operations.html#online-ddl-foreign-key-operations)

-   [表操作](innodb-online-ddl-operations.html#online-ddl-table-operations)

-   [表空间操作](innodb-online-ddl-operations.html#online-ddl-tablespace-operations)

-   [分区操作](innodb-online-ddl-operations.html#online-ddl-partitioning)

#### 索引操作

下表概述了对索引操作的在线 DDL 支持。星号表示附加信息、异常或依赖项。有关详细信息，请参阅[语法和使用说明](innodb-online-ddl-operations.html#online-ddl-index-syntax-notes).

[](<>)

**表 15.16 对索引操作的在线 DDL 支持**

| 手术 | 立即的 | 到位 | 重建表 | 允许并发 DML | 仅修改元数据 |
| --- | --- | --- | --- | -------- | ------ |
| 创建或添加二级索引 | 不 | 是的 | 不 | 是的 | 不 |
| 删除索引 | 不 | 是的 | 不 | 是的 | 是的 |
| 重命名索引 | 不 | 是的 | 不 | 是的 | 是的 |
| 添加一个`全文`指数 | 不 | 是的\* | 不\* | 不 | 不 |
| 添加一个`空间`指数 | 不 | 是的 | 不 | 不 | 不 |
| 更改索引类型 | 是的 | 是的 | 不 | 是的 | 是的 |

##### 语法和使用说明

-   创建或添加二级索引

    ```
    CREATE INDEX name ON table (col_list);
    ```

    ```
    ALTER TABLE tbl_name ADD INDEX name (col_list);
    ```

    在创建索引时，该表仍可用于读取和写入操作。这[`创建索引`](create-index.html)语句仅在访问该表的所有事务完成后才结束，以便索引的初始状态反映该表的最新内容。

    在线 DDL 支持添加二级索引意味着您通常可以通过创建没有二级索引的表，然后在加载数据后添加二级索引来加快创建和加载表和关联索引的整个过程。

    新创建的二级索引仅包含表中提交时的数据[`创建索引`](create-index.html)要么[`更改表`](alter-table.html)语句完成执行。它不包含任何未提交的值、旧版本的值或标记为删除但尚未从旧索引中删除的值。

    一些因素会影响此操作的性能、空间使用和语义。有关详细信息，请参阅[第 15.12.8 节，“在线 DDL 限制”](innodb-online-ddl-limitations.html).

-   删除索引

    ```
    DROP INDEX name ON table;
    ```

    ```
    ALTER TABLE tbl_name DROP INDEX name;
    ```

    在删除索引时，该表仍可用于读取和写入操作。这[`删除索引`](drop-index.html)语句仅在访问该表的所有事务完成后才结束，以便索引的初始状态反映该表的最新内容。

-   重命名索引

    ```
    ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name, ALGORITHM=INPLACE, LOCK=NONE;
    ```

-   添加一个`全文`指数

    ```
    CREATE FULLTEXT INDEX name ON table(column);
    ```

    添加第一个`全文`如果没有用户定义的索引，则重建表`FTS_DOC_ID`柱子。额外的`全文`可以在不重建表的情况下添加索引。

-   添加`空间的`指数

    ```
    CREATE TABLE geom (g GEOMETRY NOT NULL);
    ALTER TABLE geom ADD SPATIAL INDEX(g), ALGORITHM=INPLACE, LOCK=SHARED;
    ```

-   更改索引类型(`使用{BTREE | HASH}`)

    ```
    ALTER TABLE tbl_name DROP INDEX i1, ADD INDEX i1(key_part,...) USING BTREE, ALGORITHM=INSTANT;
    ```

#### 主键操作

下表概述了对主键操作的在线DDL支持。星号表示附加信息、异常或依赖项。看见[语法和用法说明](innodb-online-ddl-operations.html#online-ddl-primary-key-syntax-notes).

[](<>)

**表15.17主键操作的在线DDL支持**

| 活动 | 瞬间 | 在正确的位置 | 重建桌子 | 允许并发DML | 只修改元数据 |
| --- | --- | ------ | ---- | ------- | ------ |
| 添加主键 | 不 | 对\* | 对\* | 对 | 不 |
| 删除主键 | 不 | 不 | 对 | 不 | 不 |
| 删除主键并添加另一个主键 | 不 | 对 | 对 | 对 | 不 |

##### 语法和用法说明

-   添加主键

    ```
    ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
    ```

    将桌子重建到位。对数据进行了实质性的重组，使其成为一项昂贵的操作。`算法=就地`在某些条件下，如果柱必须转换为`非空`.

    重组[聚集索引](glossary.html#glos_clustered_index)始终需要复制表数据。因此，最好定义[主键](glossary.html#glos_primary_key)创建表时，而不是发出`改变桌子。。。添加主键`后来

    当你创建一个`唯一的`或`主键`索引，MySQL必须做一些额外的工作。对于`唯一的`在索引中，MySQL检查表中是否包含键的重复值。暂时`主键`在索引中，MySQL还检查`主键`列包含`无效的`.

    当您使用`算法=复制`子句，MySQL转换`无效的`将关联列中的值设置为默认值：0表示数字，空字符串表示基于字符的列和BLOB，0000-00-00 00:00:00表示`约会时间`.这是Oracle建议您不要依赖的非标准行为。使用添加主键`算法=就地`只有当[`SQL\u模式`](server-system-variables.html#sysvar_sql_mode)设置包括`严格的表`或`严格的所有表格`旗帜；当`SQL_模式`设置很严格，`算法=就地`是允许的，但如果请求的主键列包含`无效的`价值观这个`算法=就地`行为更符合标准。

    如果创建一个没有主键的表，`InnoDB`为你选择一个，可能是第一个`唯一的`上定义的键`非空`列或系统生成的键。为避免不确定性和额外隐藏柱的潜在空间要求，请指定`主键`条款作为[`创建表格`](create-table.html)陈述

    MySQL通过将现有数据从原始表复制到具有所需索引结构的临时表来创建新的聚集索引。一旦数据被完全复制到临时表中，原始表将被重命名为不同的临时表名。包含新聚集索引的临时表将使用原始表的名称重命名，原始表将从数据库中删除。

    适用于二级索引操作的联机性能增强不适用于主键索引。InnoDB表的行存储在[聚集索引](glossary.html#glos_clustered_index)根据[主键](glossary.html#glos_primary_key)，形成一些数据库系统称之为“索引组织表”。因为表结构与主键紧密相连，所以重新定义主键仍然需要复制数据。

    当主键上的操作使用`算法=就地`，即使数据仍被复制，但它比使用`算法=复制`因为：

    -   此操作不需要撤消日志记录或相关的重做日志记录`算法=就地`。这些操作会给使用`算法=复制`.

    -   二级索引项是预先排序的，因此可以按顺序加载。

    -   不使用更改缓冲区，因为二级索引中没有随机访问插入。

-   删除主键

    ```
    ALTER TABLE tbl_name DROP PRIMARY KEY, ALGORITHM=COPY;
    ```

    只有`算法=复制`支持删除主键，而不在同一主键中添加新主键`改变桌子`陈述

-   删除主键并添加另一个主键

    ```
    ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
    ```

    对数据进行了实质性的重组，使其成为一项昂贵的操作。

#### 列操作

下表概述了对列操作的在线DDL支持。星号表示附加信息、异常或依赖项。有关详细信息，请参阅[语法和用法说明](innodb-online-ddl-operations.html#online-ddl-column-syntax-notes).

[](<>)

**表15.18列操作的在线DDL支持**

| 活动 | 瞬间 | 在正确的位置 | 重建桌子 | 允许并发DML | 只修改元数据 |
| --- | --- | ------ | ---- | ------- | ------ |
| 添加列 | 对\* | 对 | 不\* | 对\* | 不 |
| 删除专栏 | 不 | 对 | 对 | 对 | 不 |
| 重命名列 | 对\* | 对 | 不 | 对\* | 对 |
| 重新排列列 | 不 | 对 | 对 | 对 | 不 |
| 设置列的默认值 | 对 | 对 | 不 | 对 | 对 |
| 更改列数据类型 | 不 | 不 | 对 | 不 | 不 |
| 延伸`瓦尔查尔`列大小 | 不 | 对 | 不 | 对 | 对 |
| 删除列的默认值 | 对 | 对 | 不 | 对 | 对 |
| 更改自动增量值 | 不 | 对 | 不 | 对 | 不\* |
| 写专栏`无效的` | 不 | 对 | 对\* | 对 | 不 |
| 写专栏`非空` | 不 | 对\* | 对\* | 对 | 不 |
| 修改`枚举`或`设置`柱 | 对 | 对 | 不 | 对 | 对 |

##### 语法和用法说明

-   添加列

    ```
    ALTER TABLE tbl_name ADD COLUMN column_name column_definition, ALGORITHM=INSTANT;
    ```

    以下限制适用于以下情况：`瞬间`算法用于添加列：

    -   添加列不能与其他列组合在同一语句中`改变桌子`不支持`算法=即时`.

    -   列只能作为表的最后一列添加。不支持将列添加到其他列中的任何其他位置。

    -   无法将列添加到使用`行_格式=压缩`.

    -   无法将列添加到包含`全文`指数

    -   无法将列添加到临时表中。临时表仅支持`算法=复制`.

    -   无法将列添加到数据字典表空间中的表中。

    -   添加列时不计算行大小限制。但是，在插入和更新表中的行的DML操作期间，会检查行大小限制。

        可以在同一行中添加多个列[`改变桌子`](alter-table.html)陈述例如：

    ```
    ALTER TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT, ALGORITHM=INSTANT;
    ```

    [`信息模式。INNODB_表`](information-schema-innodb-tables-table.html)和[`信息模式。INNODB_列`](information-schema-innodb-columns-table.html)为即时添加的列提供元数据。`信息模式。INNODB_表。速溶可乐`显示添加第一个即时列之前表中的列数。`信息模式。INNODB_列。你违约了吗`和`默认值`为即时添加的列提供有关默认值的元数据。

    添加时不允许并发DML[自动增量](glossary.html#glos_auto_increment)柱对数据进行了实质性的重组，使其成为一项昂贵的操作。至少`算法=就地，锁=共享`是必需的。

    如果需要，将重建该表`算法=就地`用于添加列。

-   删除专栏

    ```
    ALTER TABLE tbl_name DROP COLUMN column_name, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    对数据进行了实质性的重组，使其成为一项昂贵的操作。

-   重命名列

    ```
    ALTER TABLE tbl CHANGE old_col_name new_col_name data_type, ALGORITHM=INSTANT, LOCK=NONE;
    ```

    `算法=即时`MySQL 8.0.28中增加了对重命名列的支持。早期的MySQL服务器版本仅支持`算法=就地`和`算法=复制`重命名列时。

    要允许并发DML，请保持相同的数据类型，只更改列名。

    当您保持相同的数据类型和`[非]空`属性，仅更改列名，操作始终可以在线执行。

    仅允许使用以下选项重命名从另一个表引用的列：`算法=就地`.如果你使用`算法=即时`, `算法=复制`，或导致操作使用这些算法的其他条件`改变桌子`声明失败。

    `算法=即时`支持重命名虚拟列；`算法=就地`没有。

    `算法=即时`和`算法=就地`在同一语句中添加或删除虚拟列时，不支持重命名列。在这种情况下，只有`算法=复制`支持。

-   重新排列列

    要对列重新排序，请使用`第一`或`之后`在里面`改变`或`修改`操作。

    ```
    ALTER TABLE tbl_name MODIFY COLUMN col_name column_definition FIRST, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    对数据进行了实质性的重组，使其成为一项昂贵的操作。

-   更改列数据类型

    ```
    ALTER TABLE tbl_name CHANGE c1 c1 BIGINT, ALGORITHM=COPY;
    ```

    仅支持更改列数据类型`算法=复制`.

-   延伸`瓦尔查尔`列大小

    ```
    ALTER TABLE tbl_name CHANGE COLUMN c1 c1 VARCHAR(255), ALGORITHM=INPLACE, LOCK=NONE;
    ```

    所需的长度字节数[`瓦尔查尔`](char.html)列必须保持不变。对于[`瓦尔查尔`](char.html)大小为0到255字节的列，需要一个长度字节来编码该值。对于[`瓦尔查尔`](char.html)256字节或以上的列，需要两个长度字节。因此，在适当的地方[`改变桌子`](alter-table.html)只支持增加[`瓦尔查尔`](char.html)列大小从0到255字节，或从256字节到更大的大小。到位[`改变桌子`](alter-table.html)不支持增加文件的大小[`瓦尔查尔`](char.html)从小于256字节到等于或大于256字节的列。在这种情况下，所需的长度字节数从1变为2，这仅由表副本支持(`算法=复制`).例如，试图改变[`瓦尔查尔`](char.html)使用就地设置从VARCHAR（255）到VARCHAR（256）的单字节字符集的列大小[`改变桌子`](alter-table.html)返回此错误：

    ```
    ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256);
    ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change
    column type INPLACE. Try ALGORITHM=COPY.
    ```

    笔记

    数组的字节长度`瓦尔查尔`列取决于字符集的字节长度。

    减少[`瓦尔查尔`](char.html)尺寸使用到位[`改变桌子`](alter-table.html)不支持。减少[`瓦尔查尔`](char.html)大小需要一份表格副本(`算法=复制`).

-   设置列的默认值

    ```
    ALTER TABLE tbl_name ALTER COLUMN col SET DEFAULT literal, ALGORITHM=INSTANT;
    ```

    仅修改表元数据。默认列值存储在[数据字典](glossary.html#glos_data_dictionary).

-   删除列默认值

    ```
    ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT, ALGORITHM=INSTANT;
    ```

-   更改自动增量值

    ```
    ALTER TABLE table AUTO_INCREMENT=next_value, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    修改存储在内存中的值，而不是数据文件。

    在使用复制或分片的分布式系统中，有时会将表的自动增量计数器重置为特定值。插入表中的下一行使用其自动增量列的指定值。您也可以在数据仓库环境中使用这种技术，在这种环境中，您可以定期清空所有表并重新加载它们，然后从1开始重新启动自动递增序列。

-   写专栏`无效的`

    ```
    ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NULL, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    将桌子重建到位。对数据进行了实质性的重组，使其成为一项昂贵的操作。

-   写专栏`非空`

    ```
    ALTER TABLE tbl_name MODIFY COLUMN column_name data_type NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    将桌子重建到位。`严格的所有表格`或`严格的表` [`SQL_模式`](server-system-variables.html#sysvar_sql_mode)是手术成功的必要条件。如果列包含空值，则操作失败。服务器禁止更改可能导致引用完整性丢失的外键列。看见[第13.1.9节“更改表格声明”](alter-table.html).数据被大量重组，这使其成为一项昂贵的操作。

-   修改`枚举`或`设置`柱

    ```
    CREATE TABLE t1 (c1 ENUM('a', 'b', 'c'));
    ALTER TABLE t1 MODIFY COLUMN c1 ENUM('a', 'b', 'c', 'd'), ALGORITHM=INSTANT;
    ```

    修改[`枚举`](enum.html)或[`设置`](set.html)列中添加新的枚举或集合成员*终止*只要数据类型的存储大小不变，就可以立即或就地执行有效成员值列表的更新。例如，将成员添加到[`设置`](set.html)包含8个成员的列将每个值所需的存储空间从1字节更改为2字节；这需要一份表格副本。在列表中间添加成员会导致现有成员重新编号，这需要表复制。

#### 生成的列操作

下表概述了对生成的列操作的在线DDL支持。有关详细信息，请参阅[语法和用法说明](innodb-online-ddl-operations.html#online-ddl-generated-column-syntax-notes).

[](<>)

**表15.19生成列操作的在线DDL支持**

| 活动 | 瞬间 | 在正确的位置 | 重建桌子 | 允许并发DML | 只修改元数据 |
| --- | --- | ------ | ---- | ------- | ------ |
| 添加`存储`柱 | 不 | 不 | 对 | 不 | 不 |
| 修改`存储`列顺序 | 不 | 不 | 对 | 不 | 不 |
| 扔掉一个`存储`柱 | 不 | 对 | 对 | 对 | 不 |
| 添加`事实上的`柱 | 对 | 对 | 不 | 对 | 对 |
| 修改`事实上的`列顺序 | 不 | 不 | 对 | 不 | 不 |
| 扔掉一个`事实上的`柱 | 对 | 对 | 不 | 对 | 对 |

##### 语法和用法说明

-   添加`存储`柱

    ```
    ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) STORED), ALGORITHM=COPY;
    ```

    `添加列`不是存储列的就地操作（在不使用临时表的情况下完成），因为表达式必须由服务器计算。

-   修改`存储`列顺序

    ```
    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED FIRST, ALGORITHM=COPY;
    ```

    将桌子重建到位。

-   扔掉一个`存储`柱

    ```
    ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    将桌子重建到位。

-   添加`事实上的`柱

    ```
    ALTER TABLE t1 ADD COLUMN (c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL), ALGORITHM=INSTANT;
    ```

    对于非分区表，可以立即或就地添加虚拟列。

    添加`事实上的`不是分区表的就地操作。

-   修改`事实上的`列顺序

    ```
    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL FIRST, ALGORITHM=COPY;
    ```

-   扔掉一个`事实上的`柱

    ```
    ALTER TABLE t1 DROP COLUMN c2, ALGORITHM=INSTANT;
    ```

    扔掉一个`事实上的`对于非分区表，可以立即或就地执行列。

#### 外键操作

下表概述了外键操作的在线DDL支持。星号表示附加信息、异常或依赖项。有关详细信息，请参阅[语法和用法说明](innodb-online-ddl-operations.html#online-ddl-foreign-key-syntax-notes).

[](<>)

**表15.20外键操作的在线DDL支持**

| 活动 | 瞬间 | 在正确的位置 | 重建桌子 | 允许并发DML | 只修改元数据 |
| --- | --- | ------ | ---- | ------- | ------ |
| 添加外键约束 | 不 | 对\* | 不 | 对 | 对 |
| 删除外键约束 | 不 | 对 | 不 | 对 | 对 |

##### 语法和用法说明

-   添加外键约束

    这个`就地`当[`外键检查`](server-system-variables.html#sysvar_foreign_key_checks)它是残疾的。否则，只有`复制`算法是支持的。

    ```
    ALTER TABLE tbl1 ADD CONSTRAINT fk_name FOREIGN KEY index (col1)
      REFERENCES tbl2(col2) referential_actions;
    ```

-   删除外键约束

    ```
    ALTER TABLE tbl DROP FOREIGN KEY fk_name;
    ```

    可以使用联机方式删除外键[`外键检查`](server-system-variables.html#sysvar_foreign_key_checks)选项已启用或禁用。

    如果不知道特定表上外键约束的名称，请发出以下语句并在`限制`针对每个外键的条款：

    ```
    SHOW CREATE TABLE table\G
    ```

    或者，查询[`信息模式。表2.1.1约束条件`](information-schema-table-constraints-table.html)使用`你的名字`和`约束类型`列来标识外键名称。

    也可以在一条语句中删除外键及其关联索引：

    ```
    ALTER TABLE table DROP FOREIGN KEY constraint, DROP INDEX index;
    ```

笔记

如果[外键](glossary.html#glos_foreign_key)已经存在于正在修改的表中（即[子表](glossary.html#glos_child_table)包含`外键。。。参考`子句），附加限制适用于在线DDL操作，即使那些不直接涉及外键列的操作：

-   一[`改变桌子`](alter-table.html)如果对父表的更改通过`更新`或`删除时`使用`大量`或`设为空`参数。

-   同样，如果一张桌子是[父表](glossary.html#glos_parent_table)在外键关系中，即使它不包含任何`外键`但是，它可以等待[`改变桌子`](alter-table.html)如果[`插入`](insert.html), [`使现代化`](update.html)或[`删去`](delete.html)语句导致`更新`或`删除时`子表中的操作。

#### 表操作

下表概述了对表操作的在线DDL支持。星号表示附加信息、异常或依赖项。有关详细信息，请参阅[语法和用法说明](innodb-online-ddl-operations.html#online-ddl-table-syntax-notes).

[](<>)

**表15.21表操作的在线DDL支持**

| 活动 | 瞬间 | 在正确的位置 | 重建桌子 | 允许并发DML | 只修改元数据 |
| --- | --- | ------ | ---- | ------- | ------ |
| 改变`行格式` | 不 | 对 | 对 | 对 | 不 |
| 改变`键块大小` | 不 | 对 | 对 | 对 | 不 |
| 设置持久表统计信息 | 不 | 对 | 不 | 对 | 对 |
| 指定字符集 | 不 | 对 | 对\* | 不 | 不 |
| 转换字符集 | 不 | 不 | 对\* | 不 | 不 |
| 优化表格 | 不 | 对\* | 对 | 对 | 不 |
| 重建`武力`选项 | 不 | 对\* | 对 | 对 | 不 |
| 执行空重建 | 不 | 对\* | 对 | 对 | 不 |
| 重命名表 | 对 | 对 | 不 | 对 | 对 |

##### 语法和用法说明

-   改变`行格式`

    ```
    ALTER TABLE tbl_name ROW_FORMAT = row_format, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    对数据进行了实质性的重组，使其成为一项昂贵的操作。

    有关`行格式`选项，请参见[表格选项](create-table.html#create-table-options).

-   改变`键块大小`

    ```
    ALTER TABLE tbl_name KEY_BLOCK_SIZE = value, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    对数据进行了实质性的重组，使其成为一项昂贵的操作。

    有关`键块大小`选项，请参见[表格选项](create-table.html#create-table-options).

-   设置持久表统计信息选项

    ```
    ALTER TABLE tbl_name STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    仅修改表元数据。

    持久性统计数据包括`持久的`, `统计数据自动更新`和`统计数据样本页面`。有关更多信息，请参阅[第15.8.10.1节，“配置持久优化器统计参数”](innodb-persistent-stats.html).

-   指定字符集

    ```
    ALTER TABLE tbl_name CHARACTER SET = charset_name, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    如果新字符编码不同，则重建表。

-   转换字符集

    ```
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name, ALGORITHM=COPY;
    ```

    如果新字符编码不同，则重建表。

-   优化表格

    ```
    OPTIMIZE TABLE tbl_name;
    ```

    不支持对具有的表执行就地操作`全文`索引。该操作使用`就地`算法，但是`算法`和`锁`不允许使用语法。

-   用`武力`选项

    ```
    ALTER TABLE tbl_name FORCE, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    使用`算法=就地`从MySQL 5.6.17开始``. `算法=就地`对于具有`全文`索引。

-   执行“空”重建

    ```
    ALTER TABLE tbl_name ENGINE=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;
    ```

    使用`算法=就地`从MySQL 5.6.17开始。`算法=就地`对于具有`全文`索引。

-   重命名表

    ```
    ALTER TABLE old_tbl_name RENAME TO new_tbl_name, ALGORITHM=INSTANT;
    ```

    可以立即或就地重命名表格。MySQL重命名与表对应的文件*`tbl_名称`*没有复印。（您也可以使用[`重命名表`](rename-table.html)语句来重命名表。看见[第13.1.36节，“重命名表格语句”](rename-table.html)。专门为重命名的表授予的权限不会迁移到新名称。它们必须手动更改。

#### 表空间操作

下表概述了对表空间操作的在线DDL支持。有关详细信息，请参阅[语法和用法说明](innodb-online-ddl-operations.html#online-ddl-tablespace-syntax-notes).

[](<>)

**表15.22表空间操作的在线DDL支持**

| 活动 | 瞬间 | 在正确的位置 | 重建桌子 | 允许并发DML | 只修改元数据 |
| --- | --- | ------ | ---- | ------- | ------ |
| 重命名常规表空间 | 不 | 对 | 不 | 对 | 对 |
| 启用或禁用常规表空间加密 | 不 | 对 | 不 | 对 | 不 |
| 启用或禁用每表文件表空间加密 | 不 | 不 | 对 | 不 | 不 |

##### 语法和用法说明

-   重命名常规表空间

    ```
    ALTER TABLESPACE tablespace_name RENAME TO new_tablespace_name;
    ```

    [`改变表空间。。。改名为`](alter-tablespace.html)使用`就地`算法，但不支持`算法`条款

-   启用或禁用常规表空间加密

    ```
    ALTER TABLESPACE tablespace_name ENCRYPTION='Y';
    ```

    [`改变表空间。。。加密`](alter-tablespace.html)使用`就地`算法，但不支持`算法`条款

    有关相关信息，请参阅[第15.13节，“InnoDB静态数据加密”](innodb-data-encryption.html).

-   启用或禁用每表文件表空间加密

    ```
    ALTER TABLE tbl_name ENCRYPTION='Y', ALGORITHM=COPY;
    ```

    有关相关信息，请参阅[第15.13节，“InnoDB静态数据加密”](innodb-data-encryption.html).

#### 分区操作

除了一些[`改变桌子`](alter-table.html)分区子句，用于分区的联机DDL操作`InnoDB`表遵循适用于常规表的相同规则`InnoDB`桌子。

一些[`改变桌子`](alter-table.html)分区子句不像常规的非分区子句那样经过相同的内部在线DDL API`InnoDB`桌子。因此，在线支持[`改变桌子`](alter-table.html)分割条款各不相同。

下表显示了每个项目的联机状态`改变桌子`分区语句。无论使用何种在线DDL API，MySQL都会尽可能减少数据复制和锁定。

[`改变桌子`](alter-table.html)使用`算法=复制`或是唯一的许可证“`算法=默认值，锁=默认值`，使用`复制`算法。换句话说，使用新的分区方案创建一个新的分区表。新创建的表包括应用于[`改变桌子`](alter-table.html)语句，并将表数据复制到新的表结构中。

[](<>)

**表15.23分区操作的在线DDL支持**

| 分割子句 | 瞬间 | 在正确的位置 | 允许DML | 笔记 |
| ---- | --- | ------ | ----- | --- |
| [`分割`](alter-table.html) | 不 | 不 | 不 | 许可证`算法=复制`, `LOCK={DEFAULT | SHARED | EXCLUSIVE}` |
| [`添加分区`](alter-table.html) | 不 | 对\* | 对\* | `算法=就地，锁={DEFAULT | NONE | SHARED | EXCLUSISVE}`支持`范围`和`列表`分区，`算法=就地，锁={DEFAULT | SHARED | EXCLUSISVE}`对于`搞砸`和`钥匙`分区，以及`算法=复制，锁={SHARED | EXCLUSIVE}`适用于所有分区类型。不复制按分区的表的现有数据`范围`或`列表`.允许同时查询`算法=复制`对于按分区的表`搞砸`或`列表`，因为MySQL在持有共享锁的同时复制数据。 |
| [`放置分区`](alter-table.html) | 不 | 对\* | 对\* | `算法=就地，锁={DEFAULT | NONE | SHARED | EXCLUSIVE}`支持。不复制按分区的表的数据`范围`或`列表`.<br/><br/>`放置分区`具有`算法=就地`删除存储在分区中的数据并删除分区。然而`放置分区`具有`算法=复制`或[`旧桌子=打开`](server-system-variables.html#sysvar_old_alter_table)重建分区表，并尝试将数据从删除的分区移动到具有兼容分区的另一个分区`隔断价值观`释义无法移动到其他分区的数据将被删除。 |
| [`丢弃分区`](alter-table.html) | 不 | 不 | 不 | 只允许`算法=默认值`, `锁定=默认值` |
| [`导入分区`](alter-table.html) | 不 | 不 | 不 | 只允许`算法=默认值`, `锁定=默认值` |
| [`截断分区`](alter-table.html) | 不 | 对 | 对 | 不复制现有数据。它只是删除行；它不会改变表本身或其任何分区的定义。 |
| [`合并分区`](alter-table.html) | 不 | 对\* | 不 | `算法=就地，锁={DEFAULT | SHARED | EXCLUSIVE}`支持。 |
| [`重新组织分区`](alter-table.html) | 不 | 对\* | 不 | `算法=就地，锁={DEFAULT | SHARED | EXCLUSIVE}`支持。 |
| [`交换分区`](alter-table.html) | 不 | 对 | 对 |  |
| [`分析分区`](alter-table.html) | 不 | 对 | 对 |  |
| [`检查分区`](alter-table.html) | 不 | 对 | 对 |  |
| [`优化分区`](alter-table.html) | 不 | 不 | 不 | `算法`和`锁`条款被忽略。重建整个桌子。看见[第24.3.4节“隔板的维护”](partitioning-maintenance.html). |
| [`重建分区`](alter-table.html) | 不 | 对\* | 不 | `算法=就地，锁={DEFAULT | SHARED | EXCLUSIVE}`支持。 |
| [`修复分区`](alter-table.html) | 不 | 对 | 对 |  |
| [`删除分区`](alter-table.html) | 不 | 不 | 不 | 许可证`算法=复制`, `LOCK={DEFAULT | SHARED | EXCLUSIVE}` |

在线非分区[`改变桌子`](alter-table.html)分区表上的操作遵循适用于常规表的相同规则。然而[`改变桌子`](alter-table.html)在每个表分区上执行联机操作，这会由于在多个分区上执行操作而增加对系统资源的需求。

有关[`改变桌子`](alter-table.html)分割子句，请参见[分区选项](alter-table.html#alter-table-partition-options)和[第13.1.9.1节，“更改表分区操作”](alter-table-partition-operations.html).有关分区的一般信息，请参阅[第24章，*分割*](partitioning.html).
