このトピックでは、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 asやinsert 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)