すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:Returning

最終更新日:May 13, 2026

このトピックでは、AliSQL の Returning 機能について説明します。 この機能により、データ操作言語 (DML) ステートメントは結果セットを返すことができ、DML ステートメントの実行を追跡するための DBMS_TRANS パッケージが提供されます。

背景情報

MySQL ステートメントの実行結果は、結果セット、OK パケット、ERR パケットの 3 種類に分けられます。 OK パケットまたは ERR パケットには、影響を受けたレコードやスキャンされたレコードなどの属性が含まれています。 しかし、データ操作言語 (DML) ステートメント (INSERT、UPDATE、または DELETE) の実行後、現在のレコードを照会するために SELECT ステートメントが実行されることがよくあります。 このような場合、Returning 機能を使用すると、2 つのステートメントの実行結果を 1 つの結果セットにまとめることで、サーバーはクライアントに 1 回だけ応答できます。

前提条件

インスタンスで RDS MySQL 8.0 または 8.4 が実行されている必要があります。

構文

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

次の表では、設定が必要なパラメーターについて説明します。

パラメーター

説明

Field_list

返すフィールドです。 複数のフィールドを指定するには、コンマ (,) で区切ります。 テーブルのフィールドを指定するか、ワイルドカード (*) を使用できます。 計算や集計などの操作はサポートされていません。

Statement

実行する DML ステートメントです。 INSERT、UPDATE、DELETE がサポートされています。

注意事項

dbms_trans.returning() ステートメントはトランザクション性を持ちません。 DML ステートメントからトランザクションコンテキストを継承します。 トランザクションを終了するには、明示的にコミットまたはロールバックする必要があります。

INSERT Returning

サーバーは、INSERT ステートメントを使用して、指定されたテーブルに挿入されたレコードを返します。

例:

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 パラメーターを指定しない場合、結果セットの代わりに 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 ステートメントを使用して、指定されたテーブルで更新されたレコードを返します。

例:

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 ステートメントを使用して、指定されたテーブルから削除されたレコードを返します。

例:

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)