mysql中怎么在指定列后添加多个列

ALTERTABLESTRUCTURE(Column){APPEND:ALTERtable-nameADDCOLUMN数据名称数据类型MODIFY数据类型:ALTERtable-nameMODIFY列数据名称data-TYPE-OTHERMODIFY列名称:ALTERtable-nameALTER列数据名称数据名称-其他数据类型删除列:altertable-namedropcolumn数据名}

MySQL数据库如何添加列??

传统情况

我们先看看在没有“立即加列”功能的情况下,加列操作是如何完成的。
另外,我们通过这个来熟悉一下这个问题的解释:

当执行列追加操作时,所有数据行都必须添加一个片数据(图中第4列的数据)

如上图所示,当改变数据行长度时,需要重建表空间(图中灰色和蓝色部分为更改的部分)

中的列定义数据字典也会更新

上述操作的问题在于,每列添加操作都需要重建表空间,需要大量的IO和大量的时间

添加立即列

“立即添加列”流程如下:

点击输入图片说明

点击进入进入回车图片说明

“立即添加列”时,只会更改数据字典的内容,包括:

在列定义中添加新列的定义

添加到新列的默认值

“立即添加列”后,当要读取表中的数据时数据时间:

自“添加立即列”不会改变行数据,该行数据是只读的3列

MySQL读取数据后会为新添加的第四列添加默认值

上面的过程描述了如何读取“立即添加列”的本质之前写入的数据是:在读取数据的过程中,“伪造”出一个新列表

那么如何读取“立即添加列”之后写入的数据呢,过程如下:

阅读时第4行:

点击进入图像描述

点击进入图像描述

通过判断时刻数据行的标题信息中的flag,可以知道该行的格式为“新格式”:行标题后多了一个新字段“列数”

通过读取“数字”数据行中的“columns”字段,可以知道该行有多少数据列中有“真实”数据,从而通过列号读取数据

从上图可以看出:读取数据写在“立即添加列”之前/之后是另外一个过程

通过上面的讨论,我们可以总结出“立即添加列”之所以有效的原因是:

当你运行“添加列立即”,不改变数据行的结构

读取“旧”数据时,“伪造”新列,使结果正确

写入“新”数据时"data,使用新的数据格式(添加了即时标志和“列号”字段)来区分新旧数据

读取“新”数据时,可以如实读取数据

<也可以我们不断地“造假”它们,“假货”什么时候会被曝光?

考虑以下场景:

使用“立即添加列”添加A列

写入数据行1

使用“立即添加列”添加B列

写入数据行2

删除B列

>

让我们推测一下最小成本“删除B列”:必须更改数据行“列数”字段中的“即时”标志位或“列数”字段至少会影响“立即添加列”之后写入的数据行,成本为类似于重建数据

从上面的推测可以看出:当类似“AddColumnNow”的操作不兼容DDL操作时,需要重建数据表,如下所示图:

点击输入图片描述

请点击输入图片描述

延伸思考题:是否可以设计其他的数据格式来替代时刻标志和“列数”字段,从而可以“立即”完成列的增/删(提示:考虑添加列-删除列-?添加列的情况)

使用限制

了解了原理之后,我们再看一下“立即添加列”的使用限制,其中前两个容易理解:

添加“立即添加列”位置的列只能在表格末尾。
最后,只有数据行应该注册在元数据中,而不需要在其他列之间添加。
没有列,并且没有关于这些列应该显示在哪里的概述。
因此,无法指定列的位置

“立即添加列”不能添加主键列且列添加不能涉及聚集索引的变化,否则就是“重建””操作并不会“立即”完成

“立即添加列”不支持压缩表格式按钮根据WL:“COMPRESSEDDisnoneedtosupported”(它不是需要支持不常见的格式)

总结回顾

我们总结一下上面的讨论:

“立即‘添加列’有效的原因是:

当你运行“立即添加列”时,数据行的结构不会改变

当读取“旧”数据时,“假”添加新列,以便结果是正确的

当你写入“新”数据,新的数据格式(增加了即时标志位和“列号”字段)以区分新旧数据

读取“新”数据时,可以如实读取数据

“立即添加“条目”的“伪造”方法不能永远维持。
当DDL不兼容“立即添加列”操作时,表数据会被重构

回到之前剩下的两个问题:

“立即添加列”是怎么做的

这个问题我们已经回答了

所谓的“立即加一栏”对业务完全没有影响吗,真的是“立即”完成吗?

可见,虽然它“立即添加一栏”,完全不会影响业务。
如果数据字典需要改变,锁是无法逃脱的。
也就是说,这里的“立即”是指“不改变数据行的结构”,而不是“不花钱完成任务”