💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!
一、概述
前面介绍了创建和删除数据表,向数据表中插入和查询数据行,对于数据行的操作,还有一个非常重要的操作——它就是数据行的更新,也就是UPDATE命令。数据行的更新操作,同样也包括了语法解析,执行计划,执行算子三大基本内容,此外它还涉及到数据存储的方式变化。
二、存储方式
「原地更新、多版本更新」
在UPDATE命令中,待更新的数据行会存在旧版本,和更新后的新版本两份数据,如何处理这两份数据,在其它商业数据库中常常提到的原地更新、多版本更新。
「NEW to OLD、OLD to NEW」
当对同一数据行执行多次UPDATE命令时,就会存在一个版本链,我们知道对于链式结构,有一个链头和一个链尾,对于多个版本的链存在两种组织方式,最新版本在链头和最老版本在链头,也就是新到旧还是旧到新。
「旧版本清理」
不同的存储方式会影响数据库中其它模块的实现机制,比如采用多版本更新机制时,就需要旧版本的清理机制,来保障完全不使用的旧版本数据不会占用过多的存储空间。
三、思考
在前面数据库内核实现的基础之上,本章继续介绍UPDATE命令的在数据库内核中的实现过程,分别从词法语法解析、执行计划生成以及执行算子三大方面进行分析和实现,在开始之前我们首先来思考几个问题:
UPDATE命令中如何找到待修改的数据行? 当修改的数据值大于原来的数据值时,如何处理?比如修改字符串类型的字段,从”123”修改为”12345”,原来的空间不够存放新值。 UPDATE命令中,是否有必要保留修改前的旧值? 带着自己的答案开始新的内容。
四、语法介绍
UPDATE命令的基本语法由四个子句组成,其中两个子句为可选。
ounter(lineUPDATE table_name SET column1 = value1, column2 = value2, … [FROM table_name1, table_name2, … ] [WHERE conditions];
「说明」
table_name,修改的数据表; column1、column2,table_name中的属性列; value1、value2,将目标属性列设置的值;可以是常量值,也可以是表达式形式; FROM子句,可选项;与其它表进行条件联接;这里的表名称列表不需要包括待修改表table_name; WHERE子句,可选项;带过滤条件的查询,对查询结果中的数据行进行修改;如果不带过滤条件时,作用域为所有的数据行。
还有一种多个属性列修改为相同值的简便写法:
ounter(lineUPDATE table_name SET (column1, column2, … ) = value1 [FROM table_name1, table_name2, … ] [WHERE conditions];
多个属性列名称同时设置为相同的value1值,以上两种写法可以混合在同一条SQL语句中。
SQL标准定义了语法主体,各商业数据库中实现语法细节不尽相同,对于多表关联查询我们这里通过FROM子句和WHERE子句来实现,这些与SELECT语法保持一致,减少语法学习的复杂度,同时这样也更灵活,可以有更复杂的联接查询。
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




