tencent cloud

TDSQL-C for MySQL

returningサポート

PDF
フォーカスモード
フォントサイズ
最終更新日: 2025-12-30 16:14:39

機能説明

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

サポートバージョン

カーネルバージョン TDSQL-C for MySQL 5.7 2.0.23/2.1.9 以降。
カーネルバージョンはTDSQL-C for MySQL 8.0の3.1.10以上です。

適用シーン

現在のTDSQL-C for MySQL 5.7 カーネルバージョン2.0.23/2.1.9以降では、それぞれINSERT ... RETURNING、REPLACE ... RETURNING、DELETE ... RETURNINGをサポートしています。この構文は、INSERT/REPLACE/DELETEステートメントで操作されたすべての行を返すことを許可します(ステートメント単位)。また、RETURNINGはプリペアドステートメントやストアドプロシージャでも使用可能です。
現在のTDSQL-C for MySQL カーネルバージョン3.1.10以降では、それぞれ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()の値はその文が実行される前の値となります。正確な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)


ヘルプとサポート

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

フィードバック