tencent cloud

TencentDB for MySQL

소식 및 공지 사항
제품 동향
신규 사용자 가이드
제품 소개
제품 개요
제품 장점
응용 시나리오
데이터베이스 아키텍처
격리 정책
제품 기능 목록
데이터베이스 인스턴스
고가용성(멀티 가용존)
리전 및 가용존
자체개발 커널
TXSQL 커널 개요
기능적 특성
성능적 특성
보안적 특성
안정적 특성
구매 가이드
과금 개요
구매 방법
연장 안내
연체 안내
환불 안내
인스턴스 비용 조정 설명
백업 공간 과금 안내
시작하기
시작 개요
MySQL 인스턴스 생성
운영 가이드
사용 제한
운영 개요
인스턴스의 점검 관리
인스턴스 프로모션
인스턴스 확장
데이터베이스 프록시
데이터베이스 관리(DMC)
계정 관리
매개변수 설정
백업과 롤백
데이터 마이그레이션
네트워크 및 보안
모니터링 및 알람
로그 센터
태그
사례 튜토리얼
TencentDB for MySQL의 사용 규범
애플리케이션 구성 자동 재연결
MySQL 마스터 인스턴스 매개변수 수정의 영향
MyISAM에서 InnoDB로의 자동 변환 제한
TencentDB for MySQL을 위한 VPC 생성
TencentDB for MySQL를 통해 비즈니스 부하 능력 향상
2리전 3데이터센터 재해 복구 아키텍처 구축
읽기/쓰기 분리로 TencentDB for MySQL 성능 향상
DTS를 사용하여 InnoDB에서 RocksDB로 데이터 마이그레이션
웹 애플리케이션을 위한 LAMP 스택 구축
Drupal 웹사이트 구축
Python을 통해 MySQL API 사용
백서
성능 백서
보안 백서
장애 처리
연결 관련
성능 관련
인스턴스 데이터 동기화 딜레이
케이스 인센시티브 설정 실패
API문서
History
Introduction
API Category
Instance APIs
Making API Requests
Data Import APIs
Database Proxy APIs
Database Audit APIs
Security APIs
Task APIs
Backup APIs
Account APIs
Rollback APIs
Parameter APIs
Database APIs
Monitoring APIs
Log-related API
Data Types
Error Codes
FAQs
과금 관련
백업 관련
롤백 관련
로그인
매개변수 수정
업그레이드 관련
계정 권한
성능 메모리
유지보수 관련 FAQ
데이터 마이그레이션
기능 특징
콘솔 관련
로그 관련
API 2.0에서 3.0으로 전환 가이드
Service Agreement
Service Level Agreement
Terms of Service
범용 참고
표준 및 인증
고객센터
용어집

returning 지원

PDF
포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-03-11 10:06:06

기능 소개

특정 사용 시나리오에서는 DML 작업 후 방금 작업한 데이터 행을 반환해야 하는 경우가 있습니다. 이 요구 사항을 구현하는 일반적인 방법에는 두 가지가 있습니다:
첫 번째 방법은 트랜잭션을 시작한 후 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 문으로 조작된 모든 행(statement 단위)을 반환할 수 있습니다. 또한 RETURNING은 프리페어드 스테이트먼트(prepared statements) 및 저장 프로시저에서도 사용이 가능합니다.
현재 MySQL 8.0 20220330 이상 커널 버전에서는 각각 DELETE ... RETURNING, INSERT ... RETURNING, REPLACE ... RETURNING, UPDATE ... RETURNING 구문을 지원하며, 해당 statement가 조작한 데이터 행을 반환할 수 있습니다.
해당 기능을 사용할 때는 다음 사항에 유의해야 합니다:
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)

저장 프로시저

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)

도움말 및 지원

문제 해결에 도움이 되었나요?

피드백