想在mysql数据库中的表中插入一列,怎么做?

现有情况

首先,让我们看看在没有“动态添加列”功能的情况下如何添加列。
我们还将用它来熟悉这个问题的图例。

执行添加列操作时,每行数据都会有以下一些补充:你必须这样做。
data(图中第4列的数据)

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

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

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

立即添加列

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

点击。
要输入图像,请单击说明

进行输入。
输入图像描述

“动态添加列”仅更改数据字典的内容,包括:

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

为新列添加默认值

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

“立即添加列”不会更改行数据,因此读取的行有3条数据它只是一列。

MySQL为新添加的第四列添加了默认值。
.获得读取数据后

上面的过程描述了如何“onthefly”读取。
对之前写入的数据进行“加列”的本质是在读取数据的过程中“伪造”出一个新的列表。

那么如何读取“动态加列”之后写入的数据呢?“?数据?程如下:

读取第4行时:

点击输入图片描述

点击输入图像描述

通过判断头部信息中的即时标志来判断一行数据是否为“新格式”格式,在该行数据后面添加一个名为“列数”​​的新字段行标题信息。
是的。

如果您读取数据行中的“列数”字段,您可以看到该行的列中有多少数据。
列包含“真实”数据,因此我们按列号读取数据。

如上图所示,读取“动态添加列”之前和之后写入的数据是不同的过程。

上面的讨论总结了为什么“即时加热”是有效的。
这是因为:

运行“动态添加列”时,不要更改数据行的结构。

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

写入“新”数据时,使用新的数据类型(添加即时标志和“列号”字段)来区分新数据。
旧数据

当你读到“新”数据时,你就能读到如实的数据

那你还能揭露“假”吗?

考虑以下场景:

使用“动态加列”。
添加A列

写入数据的第1行

使用“动态添加列”添加B列

写入数据的第2行

删除B列

我们来猜一下“删除B列”的最小成本。
需要修改一行数据。
即时标志位或“列数”字段至少会影响“即时添加列”之后写入的数据行,并且成本将类似于重写数据,如上所示。
猜测:如果“立即添加列”操作是不兼容的DDL操作,那么需要重建数据表,如下图所示:

图片描述点击进入。

请点击输入图片描述。

延伸思考题:这样才能“立即”完成添加列/删除列操作即时标志和“栏”。
你能设计另一种数据类型来代替“数字”字段吗?(提示:考虑添加列-删除列-添加列的情况))

使用限制

了解了原理之后,我们看一下“添加”的使用限制前两个很容易理解。

“动态添加列”中在哪里添加列最后,只应将数据行写入元数据,而不是在中间添加它们其他列缺失,并且这些列没有记录应出现在何处。
因此,您无法指定列的位置。

您无法“动态添加列”来添加主键列,并且添加列不能包含对聚集索引的更改。
否则,这将是一次“重建”。
"该操作不会完成,也不会“立即”完成。

“立即添加列”不支持“压缩表格格式”按钮。
根据WL:“COMPRESSEDisnoneedtosupported”(通常不推荐使用的格式)

总结回顾

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

为什么动态“添加列”是有效的:相同。

当您运行“动态添加列”时,数据行的结构不会改变。

读取“旧”数据时,新列将确保添加“假”结果是正确的。

写入“新”数据时区分新旧数据的数据格式(添加即时标志位和“列号”字段)

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

“动态添加列”的“假”做法不可能永远维持下去,如果发生与“动态添加列”操作不兼容的DDL,表数据将被重新组织。

>

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

“动态添加列”有效吗?

我回答了这个问题。

>

所谓的“即时列添加”它真的是“立即”完成而不会影响业务吗?

是的,即使“动态添加列”也根本不会影响业务。
如果您需要更改数据字典,请将其锁定。
也就是说,这里的“立即”并不是指“不花钱完成任务”,而是“不改变数行的结构”。

C#怎么取得新增一列的id,id为自增的

这里我们以MySQL为例1。
MYSQL使用SQLLAST_INSERT_ID()函数来获取刚刚插入的AUTO_INCREACE字段的ID值。
上述SQL代码必须是INSERT语句。
如果是另一条指令,则返回的ID值为零。
2、使用Command对象时,注意不要关闭该对象后再使用SELECTLAST_INSERT_ID()函数,否则得到的ID值也会为零。
INSERT必须刚刚完成,没有任何其他新指令,并且对象尚未关闭。
必须立即使用此函数才能正确获取它。
示例为:editQuery=INSERTINTO表名(...列名...)VALUES(...值名称...)