前言
这里主要是 探索一下 mysql 的自增长主键
和 insert into tz_test (field1) values ("12111111111"); 的实现
这里 有一些地方 会有不求甚解的地方, 不然 篇幅 就有点太长了
测试表结构
mysql 主键自增长
读取自增长值的地方, 读取 table->autoinc 作为当前需要使用的值
这里是做增量计算的地方, autoinc 之前是 63, 更新之后为 68
然后下面的 dict_table_autoinc_update_if_greater 是更新 table->autoinc
更新 table->autoinc
得到的 nr 为 63
下面的 compute_next_inert_id 计算之后 nr 仍然为 63
compute_next_inert_id 计算之后 nr 仍然为 63
将数据存储在当前记录的 id 字段中
mysql 将输入的字段存储到 Field* 结构
处理之前, 各个 Field* 中可以看到 ptr 中未存储数据
如下指针来自于 insert_field_list, 只有一个元素, field01 对应的 Item_field
fill_record_n_invoke_triggers 之后可以看到 field01 对应的 Item_field 的 Field
ptr 即为存储的数据, “\v12111111111”, 其中 “\v” 为 varchar 存储的长度 11, 其后的11个字符为存储的数据 “12111111111”
存储 自增长的字段的地方在这里
mysql Field* 到入库的过程
所有的字段 store 完成之后
record 中存储的就是 数据表定义的所有的数据, id, field01
可以看到这里 id 为 0x00000076 为 118, field01 为 12111111111
这里的循环会将 mysql_rec 的数据填充到
row 中, 每一个 dfield 表示一个字段信息, 会存储对应的数据的信息
将 d_tuple 转换为 mysql_rec, 这个转换是在 rec_convert_dtuple_to_rec 中
tuple 中的信息如下, 四个字段, id, trx_id, pool_ptr, field01
id 4字节, trx_id 6字节, pool_ptr 7字节, field01 11字节
rec 的数据如下
id 4字节, trx_id 6字节, pool_ptr 7字节, field01 11字节
这里是将具体的记录 添加到 page 中, 随着 mysql 的机制, 会对 page 中的数据进行持久化
持久化的代码, 我们到这里 基本上就行了
完