You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
功能
RETURNING
复制全文
下载 pdf
RETURNING
本文介绍云数据库 MySQL 版提供的 RETURNING 语法的相关信息。​
支持版本​
  • MySQL 5.7 版本,且内核小版本为 MySQL 5.7.44_20251015 及以上。​
  • MySQL 8.0 版本,且内核小版本为 MySQL 8.0.43_20251015 及以上。​
  • MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。​
背景信息​
在某些业务场景中,执行 INSERT、REPLACE、UPDATE、DELETE 等 DML 语句后,需额外进行查询以获取操作的具体记录,这增加了客户端与 MySQL Server 之间的交互次数,导致额外的性能开销与延迟。​
为简化操作流程、减少客户端与服务器之间的通信,云数据库 MySQL 版提供了 RETURNING 语法,支持在执行 DML 语句时,由服务端直接返回结果集。​
特性说明​
RETURNING 语法支持在执行 INSERT、REPLACE、UPDATE、DELETE 等 DML 语句时,直接返回结果集 (Resultset) 报文,携带受影响的行数据(返回的结果可以是任意列、表达式或子查询),无需再通过额外的 SELECT 查询来获取结果信息。​
典型的适用场景包括:​
  • 插入操作完成后,直接返回 AUTO_INCREMENT 主键以及其他列的值,以便用于后续的关联操作。​
  • 执行更新操作时,返回最新的列值或表达式的计算结果,以用于继续处理业务逻辑。​
  • 执行删除操作时,返回删除前的字段快照,用于审计或补偿记录。​
使用说明​
语法说明​
支持在单表 DML 语句原本语法的基础上追加 RETURNING select_expr 子句,select_expr 可以是以下内容:​
  • 列名​
  • 表达式​
  • *:表示展开为所有列​
  • 子查询,只能是返回一行结果的子查询​
  • Function (函数),不支持 Aggregate Function (聚合函数)​
​
DML​
语法​
INSERT ... RETURNING​
​
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]​
[INTO] tbl_name​
[PARTITION (partition_name [, partition_name] ...)]​
[(col_name [, col_name] ...)]​
{ {VALUES | VALUE} (value_list) [, (value_list)] ... }​
[AS row_alias[(col_alias [, col_alias] ...)]]​
[ON DUPLICATE KEY UPDATE assignment_list]​
[RETURNING select_expr [, select_expr] ...]​
​
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]​
[INTO] tbl_name​
[PARTITION (partition_name [, partition_name] ...)]​
SET assignment_list​
[AS row_alias[(col_alias [, col_alias] ...)]]​
[ON DUPLICATE KEY UPDATE assignment_list]​
[RETURNING select_expr [, select_expr] ...]​
​
REPLACE ... RETURNING​
​
REPLACE [LOW_PRIORITY | DELAYED]​
[INTO] tbl_name​
[PARTITION (partition_name [, partition_name] ...)]​
[(col_name [, col_name] ...)]​
{ {VALUES | VALUE} (value_list) [, (value_list)] ...​
|​
VALUES row_constructor_list​
}​
[RETURNING select_expr [, select_expr] ...]​
​
REPLACE [LOW_PRIORITY | DELAYED]​
[INTO] tbl_name​
[PARTITION (partition_name [, partition_name] ...)]​
SET assignment_list[RETURNING select_expr [, select_expr] ...]​
​
DELETE ... RETURNING​
​
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name​
[PARTITION (partition_name [, partition_name] ...)]​
[WHERE where_condition]​
[ORDER BY ...]​
[LIMIT row_count]​
[RETURNING select_expr [, select_expr] ...]​
​
UPDATE ... RETURNING​
​
UPDATE [LOW_PRIORITY] [IGNORE] table_reference​
SET assignment_list​
[WHERE where_condition]​
[ORDER BY ...]​
[LIMIT row_count]​
[RETURNING select_expr [, select_expr] ...]​
​
​
使用示例​
  • INSERT ... RETURNING​
​
MySQL [test]> create table t1 (id bigint auto_increment, name varchar(64), primary key (id));​
Query OK, 0 rows affected (0.06 sec)​
MySQL [test]> insert into t1(name) values('Jackie Chan'),('Bruce Lee') returning *;​
+----+-------------+​
| id | name |​
+----+-------------+​
| 1 | Jackie Chan |​
| 2 | Bruce Lee |​
+----+-------------+​
2 rows in set (0.01 sec)​
​
  • REPLACE ... RETURNING​
​
MySQL [test]> insert into t1(name) values('Jackie Chan') returning *;​
+----+-------------+​
| id | name |​
+----+-------------+​
| 3 | Jackie Chan |​
+----+-------------+​
1 row in set (0.00 sec)​
MySQL [test]> replace into t1(id,name) values(3, 'lisi') returning id*2, name;​
+------+------+​
| id*2 | name |​
+------+------+​
| 6 | lisi |​
+------+------+​
1 row in set (0.00 sec)​
​
  • DELETE ... RETURNING​
​
mysql> delete from t1 where name = 'Jackie Chan' returning id, LENGTH(name);​
+----+--------------+​
| id | LENGTH(name) |​
+----+--------------+​
| 1 | 11 |​
+----+--------------+​
1 row in set (0.01 sec) ​
​
  • UPDATE ... RETURNING​
​
MySQL [test]> create table t2 (id bigint primary key, cnt bigint);​
Query OK, 0 rows affected (0.03 sec)​
MySQL [test]> insert into t2 values(1,0),(2,0);​
Query OK, 2 rows affected (0.01 sec)​
Records: 2 Duplicates: 0 Warnings: 0​
MySQL [test]> update t2 set cnt = cnt + 1 returning *;​
+----+------+​
| id | cnt |​
+----+------+​
| 1 | 1 |​
| 2 | 1 |​
+----+------+​
2 rows in set (0.00 sec)​
MySQL [test]> update t2 set cnt = cnt + 1 returning *;​
+----+------+​
| id | cnt |​
+----+------+​
| 1 | 2 |​
| 2 | 2 |​
+----+------+​
2 rows in set (0.00 sec)​
​
注意事项​
  • RETURNING 子句不支持在以下语法后追加:​
  • INSERT ... SELECT ...​
  • REPLACE ... SELECT ...​
  • Multiple-Table DELETE​
  • Multiple-Table UPDATE​
  • 使用 DELETE ... RETURNING 时,DELETE 语句中的目标表不支持指定表别名(table alias)。​
  • INSERT、REPLACE、UPDATE ... RETURNING 返回更新后镜像;DELETE ... RETURNING 返回删除前镜像。​
最近更新时间:2026.08.27 11:24:31
这个页面对您有帮助吗?
有用
有用
无用
无用