新功能初探 | RDS MySQL 8.0 支持DML Returning

2019 年 9 月 12 日 阿里巴巴数据库技术

背景


MySQL 对于 statement 执行结果报文通常分为两类 ResultsetOK/ERR,针对 DML 语句则返回OK/ERR 报文,其中包括几个影响记录,扫描记录等属性。但在很多业务场景下,INSERT/UPDATE/DELETE 这样的DML语句后,通常都会跟随 SELECT 查询当前记录内容,以进行接下来的业务处理, 为了减少一次 Client <-> DB Server 交互,类似 PostgreSQL / Oracle 都提供了 returning clause 支持 DML 返回 Resultset。


AliSQL 为了减少对 MySQL 语法兼容性的侵入,并支持 returning 功能, 采用了 native procedure 的方式,使用DBMS_TRANS package,统一使用 returning procedure 来支持 DML 语句返回 Resultset。


语法


*请左右滑动阅览
    
    
      
DBMS_TRANS.returning(Field_list=>, Statement=>);


其中:  
Field list : 代表期望的返回字段,以 "," 进行分割,支持 * 号表达;
Statement :表示要执行的DML 语句, 支持 INSERT / UPDATE / DELETE;

INSERT Returning

针对 insert 语句, returning proc 返回插入到表中的记录内容;

例如:

*请左右滑动阅览

CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` int(11) NOT NULL DEFAULT '1',
  `col2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

mysql> call dbms_trans.returning("*""insert into t(id) values(NULL),(NULL)");
+----+------+---------------------+
| id | col1 | col2                |
+----+------+---------------------+
|  1 |    1 | 2019-09-03 10:39:05 |
|  2 |    1 | 2019-09-03 10:39:05 |
+----+------+---------------------+
2 rows in set (0.01 sec)


如果没有填入任何 Fields, returning 将退化成 OK/ERR 报文: 

*请左右滑动阅览

    
    
      
mysql> call dbms_trans.returning("""insert into t(id) values(NULL),(NULL)");
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t;
+----+------+---------------------+
| id | col1 | col2                |
+----+------+---------------------+
|  1 |    1 | 2019-09-03 10:40:55 |
|  2 |    1 | 2019-09-03 10:40:55 |
|  3 |    1 | 2019-09-03 10:41:06 |
|  4 |    1 | 2019-09-03 10:41:06 |
+----+------+---------------------+
4 rows in set (0.00 sec)


注意:   INSERT returning 只支持 insert values 形式的语法,类似create as, insert select 不支持, 例如:

*请左右滑动阅览

    
    
      
mysql> call dbms_trans.returning("""insert into t select * from t");
ERROR 7527 (HY000): Statement didn't support RETURNING clause

UPDATE Returning

针对 update 语句, returning 返回更新后的记录:

例如:

*请左右滑动阅览

    
    
      
mysql> call dbms_trans.returning("id, col1, col2""update t set col1 = 2 where id >2");
+----+------+---------------------+
| id | col1 | col2                |
+----+------+---------------------+
|  3 |    2 | 2019-09-03 10:41:06 |
|  4 |    2 | 2019-09-03 10:41:06 |
+----+------+---------------------+
2 rows in set (0.01 sec)


注意:  UPDATE returning 不支持多表 update 语句。

DELETE Returning

针对 delete 语句, returning 返回删除的记录前映像:

例如:

*请左右滑动阅览

    
    
      
mysql> call dbms_trans.returning("id, col1, col2""delete from t where id < 3");
+----+------+---------------------+
| id | col1 | col2                |
+----+------+---------------------+
|  1 |    1 | 2019-09-03 10:40:55 |
|  2 |    1 | 2019-09-03 10:40:55 |
+----+------+---------------------+
2 rows in set (0.00 sec)



注意


1. 事务上下文 
DBMS_TRANS.returning() 不是事务性语句,根据 DML statement 来继承 事务上下文,结束事务需要显式的 COMMIT 或者 ROLLBACK。
2. 字段不支持计算 
Field list 中,只支持表中原生的字段,或者 * 号, 不支持进行计算或者聚合等操作。



点击“阅读原文”

解锁RDS MySQL版更多信息

阿里巴巴数据库技术

微信:alibabadba



分享数据库前沿 

解构实战干货

长按二维码关注

登录查看更多
1

相关内容

一个开源的关系型数据库,开发者为瑞典 MySQL AB 公司。在2008年1月16号被 Sun 公司收购。而2009年,SUN 又被 Oracle 收购.目前 MySQL 被很多互联网企业所使用。有体积小、速度快、总体拥有成本低,开放源码等优点
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
65+阅读 · 2020年3月9日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
携程用ClickHouse轻松玩转每天十亿级数据更新
DBAplus社群
11+阅读 · 2019年8月6日
已删除
AI掘金志
7+阅读 · 2019年7月8日
A Technical Overview of AI & ML in 2018 & Trends for 2019
待字闺中
16+阅读 · 2018年12月24日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
设计和实现一款轻量级的爬虫框架
架构文摘
13+阅读 · 2018年1月17日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
Risk-Aware Active Inverse Reinforcement Learning
Arxiv
7+阅读 · 2019年1月8日
Arxiv
5+阅读 · 2018年4月22日
Arxiv
5+阅读 · 2018年3月28日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
65+阅读 · 2020年3月9日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
68+阅读 · 2020年1月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
携程用ClickHouse轻松玩转每天十亿级数据更新
DBAplus社群
11+阅读 · 2019年8月6日
已删除
AI掘金志
7+阅读 · 2019年7月8日
A Technical Overview of AI & ML in 2018 & Trends for 2019
待字闺中
16+阅读 · 2018年12月24日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
设计和实现一款轻量级的爬虫框架
架构文摘
13+阅读 · 2018年1月17日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
Top
微信扫码咨询专知VIP会员