使用在线DDL简化DDL语句
在引入在线DDL之前,通常的做法是将许多DDL操作组合到一个ALTER TABLE
语句中。因为每个ALTER TABLE
语句都涉及复制和重建表,所以一次对同一个表进行多次更改会更有效,因为这些更改都可以通过对该表执行一次重建操作来完成。缺点是涉及DDL操作的SQL代码更难维护和在不同脚本中重用。如果每次的特定更改都不相同,则可能必须ALTER TABLE
为每个稍有不同的方案构建一个新的综合系统。
对于可以在线完成的DDL操作,您可以将它们分成单独的ALTER TABLE
语句,以简化脚本编写和维护,而又不牺牲效率。例如,您可能会采用如下复杂的语句:
ALTER TABLE t1ADD INDEX i1(c1),ADD UNIQUE INDEX i2(c2),CHANGE c4_old_name c4_new_name INTEGERUNSIGNED ;
并将其分解为可以独立测试和执行的简单部分,例如:
ALTER TABLE t1ADD INDEX i1(c1);ALTER TABLE t1ADD UNIQUE INDEX i2(c2);ALTER TABLE t1CHANGE c4_old_name c4_new_name INTEGERUNSIGNED NOT NULL;
您可能仍将多部分ALTER TABLE
语句用于:
- 必须按特定顺序执行的操作,例如创建索引,后跟使用该索引的外键约束。
- 所有操作都使用
LOCK
您希望成组成功或失败的特定子句。 - 无法在线执行的操作,即仍使用表复制方法的操作。
- 您指定了
ALGORITHM=COPY
或的操作old_alter_table=1
,以便在特殊情况下为实现精确的向后兼容性而需要强制执行表复制行为。