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

PolarDB:Returning 機能

最終更新日:Mar 29, 2026

INSERT、UPDATE、または DELETE 文を実行した後、Returning 機能は、追加の SELECT を必要とせずに、影響を受ける行を即座に返します。これは、AUTO_INCREMENT ID や DEFAULT 列の値など、データベースが生成する値を取得するのに役立ちます。

前提条件

開始する前に、以下を確認してください。

  • ご利用の PolarDB for MySQL クラスターが、リビジョンバージョン 5.7.1.0.6 以降のバージョン 5.7 で実行されていること。バージョンを確認するには、「エンジンバージョンを照会する」をご参照ください。

仕組み

標準 MySQL は、DML 文の実行後、OK または ERR メッセージのみを返します。このメッセージには、影響を受ける行とスキャンされた行の数が含まれますが、実際の行データは含まれません。データを検査するには、通常、追加の SELECT を実行します。これは、サーバーへの 2 回目のラウンドトリップとなります。

Returning 機能は、この 2 回目のラウンドトリップを不要にします。ご利用の DML 文と列リストを指定して DBMS_TRANS.RETURNING() を呼び出します。このプロシージャは DML を実行し、一致する行を単一の応答で返します。

CALL DBMS_TRANS.RETURNING() はトランザクション文ではありません。これは、渡された DML 文のトランザクションコンテキストを継承します。トランザクションを明示的にコミットまたはロールバックしてください。

構文

CALL DBMS_TRANS.RETURNING(Field_list=>, Statement=>);

パラメーター

パラメーター説明
Field_list返される列のカンマ区切りのリスト、またはすべての列を表す *。計算および集約式はサポートされていません。結果セットを抑制し、OK または ERR メッセージのみを返すには、空の文字列 ("") を渡します。
Statement実行する DML 文。サポートされているタイプ: INSERT、UPDATE、DELETE。

制限事項

  • INSERT: INSERT ... VALUES 文のみがサポートされています。INSERT ... SELECT および CREATE TABLE ... AS SELECT はサポートされていません。サポートされていない形式を実行すると、ERROR 7527 (HY000): Statement didn't support RETURNING clause が返されます。

  • UPDATE: 複数テーブルの UPDATE 文はサポートされていません。

すべての例では、次のテーブルを使用します。

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;

INSERT

データベースによって生成される AUTO_INCREMENT id および DEFAULT col2 の値を含む、挿入された行のすべての列を返します。

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)

結果セットを抑制し、OK または ERR メッセージのみを返すには、Field_list として空の文字列を渡します。

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

UPDATE

更新された行を新しい列の値とともに返します。

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)

DELETE

削除前の値を含む、削除された行を返します。

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)