Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Simplifying DDL Statements with Online DDL

17.12.6 使用在线 DDL 简化 DDL 语句

在引入在线 DDL之前,通常的做法是将多个 DDL 操作合并到单个 ALTER TABLE 语句中。因为每个 ALTER TABLE 语句都涉及到复制和重建表,因此更高效的是一次性地对同一个表进行多个更改,因为这些更改可以在单个重建操作中完成。缺点是,涉及 DDL 操作的 SQL 代码变得难以维护和在不同脚本中重用。如果每次的具体更改不同,你可能需要为每个略有不同的场景构建一个新的复杂的 ALTER TABLE

对于可以在线完成的 DDL 操作,你可以将它们分解成单个 ALTER TABLE 语句,以便于脚本和维护,而不牺牲效率。例如,你可以将复杂的语句分解成更简单的部分,以便独立测试和执行,例如:

ALTER TABLE t1 ADD INDEX i1(c1), ADD UNIQUE INDEX i2(c2),
  CHANGE c4_old_name c4_new_name INTEGER UNSIGNED;

并将其分解成更简单的部分,以便独立测试和执行,例如:

ALTER TABLE t1 ADD INDEX i1(c1);
ALTER TABLE t1 ADD UNIQUE INDEX i2(c2);
ALTER TABLE t1 CHANGE c4_old_name c4_new_name INTEGER UNSIGNED NOT NULL;

你仍然可以使用多部分 ALTER TABLE 语句来:

  • 执行必须按特定顺序执行的操作,例如创建索引,然后创建使用该索引的外键约束。

  • 执行使用相同特定 LOCK 子句的操作,你想让它们作为一个组来成功或失败。

  • 执行无法在线完成的操作,即仍然使用表复制方法的操作。

  • 执行指定 ALGORITHM=COPYold_alter_table=1 的操作,以便在特殊场景中实现精确的向后兼容性。