MySQL 8.3 Release Notes
在引入在线 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=COPY
或old_alter_table=1
的操作,以便在特殊场景中实现精确的向后兼容性。