tencent cloud

TencentDB for MySQL

returningをサポート

PDF
フォーカスモード
フォントサイズ
最終更新日: 2026-03-11 10:03:30

機能説明

特定の使用シナリオでは、DML 操作後に直前に操作したデータ行を取得する必要があります。この要件を実現するには、一般的に2つの方法があります:
一つ目は、トランザクションを有効にした後、DML 文の直後に SELECT 文を実行する方法です。
二つ目は、トリガーなどの比較的複雑な操作を使用して実現する方法です。
前者は主にSELECT文の実行コストを増加させ、後者はSQLの実装をより複雑で柔軟性に欠けるものにします(トリガーを作成する必要があります)。 したがって、RETURNING構文の設計は主にこのシナリオを最適化するためのものであり、DML文の後にRETURNINGキーワードを追加することで、上記の要件を柔軟かつ効率的に実現できます。

対応バージョン

カーネルバージョン MySQL 5.7 20210330 以降
カーネルバージョン MySQL 8.0 20220330 以降

適用シーン

現在、MySQL 5.7 20210330 以降のカーネルバージョンでは、それぞれ INSERT ... RETURNING、REPLACE ... RETURNING、DELETE ... RETURNING をサポートしています。この構文は、INSERT/REPLACE/DELETE 文によって操作されたすべての行(ステートメント単位)を返すことを可能にします。また、RETURNING はプリペアドステートメントやストアドプロシージャ内での使用もサポートしています。
現在、MySQL 8.0 20220330 以降のカーネルバージョンでは、それぞれ DELETE ... RETURNING、INSERT ... RETURNING、REPLACE ... RETURNING、UPDATE ... RETURNING 構文をサポートしており、そのステートメントによって操作されたデータ行を返すことができます。
この機能を使用する際には、以下の点にご注意ください:
1. RETURNINGを使用する場合、DELETE...RETURNING文は変更前のデータを返し、INSERT/REPLACE...RETURNINGは変更後のデータを返します。
2. INSERT/REPLACE シナリオでは、外部テーブルのカラムは returning 句内のサブクエリ文に対して、現時点ではアクセスできません。
3. INSERT/REPLACEのRETURNING文でlast_insert_id()を返す必要がある場合、その値は当該文が実行成功する前の値となります。正確なlast_insert_id()値を取得するには、RETURNING句で直接そのテーブルの自動増分IDカラムを返すことが推奨されます。

使用説明

INSERT... RETURNING

MySQL [test]> CREATE TABLE `t1` (id1 INT);
Query OK, 0 rows affected (0.04 sec)

MySQL [test]> CREATE TABLE `t2` (id2 INT);
Query OK, 0 rows affected (0.03 sec)

MySQL [test]> INSERT INTO t2 (id2) values (1);
Query OK, 1 row affected (0.00 sec)

MySQL [test]> INSERT INTO t1 (id1) values (1) returning *, id1 * 2, id1 + 1, id1 * id1 as alias, (select * from t2);
+------+---------+---------+-------+--------------------+
| id1 | id1 * 2 | id1 + 1 | alias | (select * from t2) |
+------+---------+---------+-------+--------------------+
| 1 | 2 | 2 | 1 | 1 |
+------+---------+---------+-------+--------------------+
1 row in set (0.01 sec)

MySQL [test]> INSERT INTO t1 (id1) SELECT id2 from t2 returning id1;
+------+
| id1 |
+------+
| 1 |
+------+
1 row in set (0.01 sec)

REPLACE ... RETURNING

MySQL [test]> CREATE TABLE t1(id1 INT PRIMARY KEY, val1 VARCHAR(1));
Query OK, 0 rows affected (0.04 sec)

MySQL [test]> CREATE TABLE t2(id2 INT PRIMARY KEY, val2 VARCHAR(1));
Query OK, 0 rows affected (0.03 sec)

MySQL [test]> INSERT INTO t2 VALUES (1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

MySQL [test]> REPLACE INTO t1 (id1, val1) VALUES (1, 'a');
Query OK, 1 row affected (0.00 sec)

MySQL [test]> REPLACE INTO t1 (id1, val1) VALUES (1, 'b') RETURNING *;
+-----+------+
| id1 | val1 |
+-----+------+
| 1 | b |
+-----+------+
1 row in set (0.01 sec)

DELETE ... RETURNING

MySQL [test]> CREATE TABLE t1 (a int, b varchar(32));
Query OK, 0 rows affected (0.04 sec)

MySQL [test]> INSERT INTO t1 VALUES
-> (7,'ggggggg'), (1,'a'), (3,'ccc'),
-> (4,'dddd'), (1,'A'), (2,'BB'), (4,'DDDD'),
-> (5,'EEEEE'), (7,'GGGGGGG'), (2,'bb');
Query OK, 10 rows affected (0.03 sec)
Records: 10 Duplicates: 0 Warnings: 0

MySQL [test]> DELETE FROM t1 WHERE a=2 RETURNING *;
+------+------+
| a | b |
+------+------+
| 2 | BB |
| 2 | bb |
+------+------+
2 rows in set (0.01 sec)

MySQL [test]> DELETE FROM t1 RETURNING *;
+------+---------+
| a | b |
+------+---------+
| 7 | ggggggg |
| 1 | a |
| 3 | ccc |
| 4 | dddd |
| 1 | A |
| 4 | DDDD |
| 5 | EEEEE |
| 7 | GGGGGGG |
+------+---------+
8 rows in set (0.01 sec)

ストアドプロシージャ

MySQL [test]> CREATE TABLE `t` (id INT);
Query OK, 0 rows affected (0.03 sec)

MySQL [test]> delimiter $$
MySQL [test]> CREATE PROCEDURE test(in param INT)
-> BEGIN
-> INSERT INTO t (id) values (param) returning *;
-> END$$
Query OK, 0 rows affected (0.00 sec)
MySQL [test]> delimiter ;

MySQL [test]> CALL test(100);
+------+
| id |
+------+
| 100 |
+------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック