MariaDB starting with 10.5.0
----------------------------
INSERT ... RETURNING was added in MariaDB 10.5.0, and returns a resultset of
the inserted rows.

Syntax
------

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
 [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]
 {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
 [ ON DUPLICATE KEY UPDATE
 col=expr
  [, col=expr] ... ] [RETURNING select_expr
   [, select_expr ...]]

Or:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
  [INTO] tbl_name [PARTITION (partition_list)]
  SET col={expr | DEFAULT}, ...
  [ ON DUPLICATE KEY UPDATE
   col=expr
    [, col=expr] ... ] [RETURNING select_expr
   [, select_expr ...]]

Or:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
  [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]
  SELECT ...
  [ ON DUPLICATE KEY UPDATE
   col=expr
    [, col=expr] ... ] [RETURNING select_expr
   [, select_expr ...]]

Description
-----------

INSERT ... RETURNING returns a resultset of the inserted rows.

This returns the listed columns for all the rows that are inserted, or
alternatively, the specified SELECT expression. Any SQL expressions which can
be calculated can be used in the select expression for the RETURNING clause,
including virtual columns and aliases, expressions which use various operators
such as bitwise, logical and arithmetic operators, string functions, date-time
functions, numeric functions, control flow functions, secondary functions and
stored functions. Along with this, statements which have subqueries and
prepared statements can also be used.

Examples
--------

Simple INSERT statements:

CREATE OR REPLACE TABLE t2 (id INT, animal VARCHAR(20), t TIMESTAMP);

INSERT INTO t2 (id) VALUES (2),(3) RETURNING id,t;
+------+---------------------+
| id   | t                   |
+------+---------------------+
|    2 | 2021-04-28 00:59:32 |
|    3 | 2021-04-28 00:59:32 |
+------+---------------------+

INSERT INTO t2(id,animal) VALUES
(1,'Dog'),(2,'Lion'),(3,'Tiger'),(4,'Leopard')  
 RETURNING id,id+id,id&id,id||id;
+------+-------+-------+--------+
| id   | id+id | id&id | id||id |
+------+-------+-------+--------+
|    1 |     2 |     1 |      1 |
|    2 |     4 |     2 |      1 |
|    3 |     6 |     3 |      1 |
|    4 |     8 |     4 |      1 |
+------+-------+-------+--------+

Using stored functions in RETURNING

DELIMITER |
CREATE FUNCTION f(arg INT) RETURNS INT
  BEGIN
   RETURN (SELECT arg+arg);
  END|

DELIMITER ;

PREPARE stmt FROM "INSERT INTO t1 SET id1=1, animal1='Bear' RETURNING f(id1),
UPPER(animal1)";

EXECUTE stmt;
+---------+----------------+
| f(id1)  | UPPER(animal1) |
+---------+----------------+
|       2 | BEAR           |
+---------+----------------+

Subqueries in the RETURNING clause that return more than one row or column
cannot be used.

Aggregate functions cannot be used in the RETURNING clause. Since aggregate
functions work on a set of values, and if the purpose is to get the row count,
ROW_COUNT() with SELECT can be used or it can be used in
INSERT...SELECT...RETURNING if the table in the RETURNING clause is not the
same as the INSERT table.

URL: https://mariadb.com/kb/en/insertreturning/