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: 0UPDATE
更新された行を新しい列の値とともに返します。
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)