全部產品
Search
文件中心

ApsaraDB RDS:Returning

更新時間:Feb 28, 2024

AliSQL提供returning功能,支援DML語句返回Resultset,同時提供了工具包(DBMS_TRANS)便於您快捷使用。

背景資訊

MySQL的語句執行結果報文通常分為三類:Resultset、OK和ERR。針對DML語句返回的是OK或ERR報文,其中包括影響記錄、掃描記錄等屬性。但在很多業務情境下,執行INSERT、UPDATE、DELETE這樣的DML語句後,都會跟隨SELECT查詢目前記錄內容,以進行接下來的業務處理,為了減少一次用戶端和伺服器的互動,returning功能支援使用DML語句後返回Resultset。

前提條件

執行個體版本為RDS MySQL 8.0。

文法

DBMS_TRANS.returning(<Field_list>,<Statement>);

參數說明如下。

參數說明
Field_list期望的返回欄位,多個欄位以英文逗號(,)進行分隔,支援表中原生的欄位或星號(*),不支援進行計算或者彙總等操作。
Statement執行的DML語句,支援INSERT、UPDATE、DELETE。

注意事項

dbms_trans.returning()不是事務性語句,會根據DML語句來繼承事務上下文,結束事務需要顯式的提交或者復原。

INSERT Returning

針對INSERT語句,returning返回插入到表中的記錄內容。

樣本:

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)
說明
  • 如果沒有填入Field_list,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 asinsert 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)