暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TDSQL 新功能预告之update/delete 语句的 returning 子句

数据库开发者 2021-04-15
1350

在一些业务场景中,用户需要更新一行或者多行目标数据行,然后获得自己刚刚更新之后的行。对于mysql用户来说,要做到这一点,用户通常需要在一个显式的事务中执行update语句,然后使用相同的查询条件把update的语句取出来。之所以要在显式事务中做,是为了防止其他并发的事务update了本连接刚刚update的行,那样的话,随后的select语句得到行就不是本连接刚刚update之后的行了,因为这些行又被其他事务更新过了。

而在oracle和postgresql数据库中,用户可以使用update/delete语句的returning子句,用一条语句完成上述工作。这样的好处是可以提升效率,省去的开销包括发送一条select语句以及做目标行的查找等工作;省去的开销还包括操作显式事务的开销,也就是发送begin和commit语句的开销。因此,使用update...returning 语句预期可以比在显式事务中update行,然后select出来,能够提升性能10%以上。


所以这是一个很好的功能。事实上如果你搜索 "mysql update returning",你还能搜到不少在mysql中实现类似oracle/postgresql的单条update/delete语句的returning子句的文章,通过借助触发器和临时表等技巧和复杂的操作。但是这些复杂的步骤导致语句执行效率也显著降低了,并且使用也不方便(需要对每个数据表创建触发器)。

为了提升用户的程序效率,降低用户的开发难度,提升用户使用TDSQL的体验,我们决定在TDSQL中也实现update/delete语句的returning子句。我近来在TDSQL-percona-mysql-5.7 上面已经实现了update...returning 和delete...returning语句,前者返回update语句更新后的行,后者返回delete语句删除的行。在TDSQL的网关也支持该语法后,该功能就对用户可见了。 预计在不久的将来,用户将可以在TDSQL 上使用这些功能。

下面我贴个图展示一下这个很cool的功能。


首先,建表并填充数据。


现在我们执行 update... returning 语句:


然后执行 delete... returning 子句:



最后,explain一下update/delete... returning 子句



文章转载自数据库开发者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论