自己动手写数据库系统:解释执行 update 和 delete 对应的 sql 语句

在上一节我们完成了 select 语句的解释执行,本节我们看看 Update 和 Delete 对应的语句如何解释执行,当然他们的实现原理跟我们前面实现的 select 语句执行大同小异。无论是 update还是 delete 都是对数据表的修改,因此他们的实现方法基本相同。

假设我们要执行如下 sql 语句:

update STUDENT set MajorId=20 where MajorId=30 and GradYear=2020

delete from STUDENT where MajorId=30 and GradYear=2020

要完成上面的代码,我们需要 scan底层的文件块,找到所有满足 where 条件的记录,如果语句是 update,那么把找到的记录修改掉,如果是 delete,那么把找到的记录给删除掉。我们看看具体的代码实现,首先我们添加 UpdatePlanner 的接口定义,在 planner 的 interface.go 文件中增加代码如下:

package planner

import (
	"parser"
	"record_manager"
	"tx"
)

type Plan interface {
   
   
	Open() interface{
   
   }
	BlocksAccessed() int               //对应 B(s)
	RecordsOutput() int                //对应 R(s)
	DistinctValues(fldName string) int //对应 V(s,F)
	Schema() record_manager.SchemaInterface
}

type QueryPlanner interface {
   
   
	CreatePlan(data *parser.QueryData, tx *tx.Transation) Plan
}

type UpdatePlanner interface {
   
   
	/*
		解释执行 insert 语句,返回被修改的记录条数
	*/
	ExecuteInsert(data *parser.InsertData, tx *tx.Transation) int

	/*
		解释执行 delete 语句,返回被删除的记录数
	*/
	ExecuteDelete(data *parser.DeleteData, tx *tx.Transation) int

	/*
		解释执行 create table 语句,返回新建表中的记录数
	*/
	ExecuteCreateTable(data *parser.CreateTableData, tx *tx.Transation) int

	/*
		解释执行 create index 语句,返回当前建立了索引的记录数
		TODO
	*/
	//ExecuteCreateIndex(data *parser.CreateIndexData, tx *tx.Transation) int
}

在 planner 目录下新建文件 update_planner.go,输入代码如下:

package planner

import (
	metadata_manager "metadata_management"
	"parser"
	"query"
	"tx"
)

type BasicUpdatePlanner struct {
   
   
	mdm *metadata_manager.MetaDataManager
}

func NewBasicUpdatePlanner(mdm *metadata_manager.MetaDataManager) *BasicUpdatePlanner {
   
   
	return &BasicUpdatePlanner{
   
   
		mdm: mdm,
	}
}

func (b *BasicUpdatePlanner) ExecuteDelete(data *parser.DeleteData, tx *tx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值