MySQL表操作过程的基础代码解析
2022/4/12 8:13:06
本文主要是介绍MySQL表操作过程的基础代码解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
MySQL 的表有很多种,对表的操作主要是增删改查,今天来浅谈一下这些操作的底层代码和流程,以下以 tmp table为例子,为了更好的说明操作流程,该表没有建立 primary key。
1.首先创建一张 tmp table,第三个参数 is_virtual=false 代表这不是虚拟表,如果这个值设置为true那说明这是虚拟表,主要给存储过程建立临时表来存储参数的,这种虚拟表没有handler,只能存储列信息和单行列值,不能存放多行值,不能进行增删操作。
Table *table = create_tmp_table_from_fields(thd, *get_field_list(), false, options, table_alias);
创建表过程中会做以下操作:
1、初始化表:table->init_tmp_table 2、用传进来的create_field 信息创建表的列:make_field 3、创建表增删改查用的操作句柄:setup_tmp_table_handler
2、查找操作
table->file->ha_rnd_init(true) handler 初始化 int rec = table->file->ha_rnd_next(table->record[0]) 从第一行开始查找,一次指针向下跳一行,table->record[0]用于存储查到的值 对结果的判断: switch (rec) { case 0: { 查找成功可以取出查到的值,此时该行值在table->field[col],col代表第几列 break; } case HA_ERR_END_OF_FILE: if (table->file->ha_rnd_end()) return true; 查找到最后一行退出 break; default: 查找出错处理
3、插入一行,这个操作相对简单只有两步
for (ulonglong u = 0; u < upper_bound; ++u) if (table->field[i]->store(u, true)) return true; 首先循环把值u存入第i列的record[0] if (write_row()) return true;直接把值从record[0]写入表即可
3、更新一行
if (table->file->ha_rnd_init(true)) return true; 初始化handler for (int i = 0; i < offset_table + 1; i++) { if (table->file->ha_rnd_next(table->record[1])) return true; 让指针跳到指定要更新的那一行,注意这里该行的值存在record[1] } memcpy(table->record[0], table->record[1], (size_t)table->s->reclength);把值从record[1]拷贝到record[0] (*value)->save_in_field(get_field(i), false); 把value值存入第i列的record[0],注意此时别的列值还是表里查到的值,这样record[0]就是新的值 if (table->file->ha_update_row(table->record[1], table->record[0])) 更新数据,这里record[1]是旧的值即表里的值,record[0]是新的值即待更新的值 return true; if (table->file->ha_rnd_end()) return true; 结束本次handler
4、删除一行
table->file->ha_rnd_init(true) handler初始化 for (int i = 0; i < offset_table + 1; i++) { if (table->file->ha_rnd_next(table->record[0])) return true; 让指针跳到指定要删除的那一行 } ret = table->file->ha_delete_row(table->record[0]); 删除当前行 if (table->file->ha_rnd_end()) return true; 结束本次handler
5、关闭表
close_tmp_table(table); 关闭临时表 free_tmp_table(table); 释放表资源
6、打开表
open_tmp_table(TABLE *table)这个打开表
以上是没有主键和索引的临时表操作,如果是有主键的表就涉及到索引的查询操作,这期不涉及这个知识点,下期再谈。
Enjoy GreatSQL :)
这篇关于MySQL表操作过程的基础代码解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-16MySQL资料:新手入门教程
- 2024-11-15MySQL教程:初学者必备的MySQL数据库入门指南
- 2024-11-15MySQL教程:初学者必看的MySQL入门指南
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程