MariaDB: INSERT e DELETE ... RETURNING, uma ida ao banco em vez de duas
Com RETURNING, o INSERT ou o DELETE devolve as linhas afetadas, com IDs e valores padrão, sem um SELECT extra.

Sabe aquele bumerangue que você joga e ele volta com a resposta? É o RETURNING. Você manda o INSERT e ele volta com o ID, a data de criação e o que mais você pedir.
Este artigo faz parte da série MariaDB além do MySQL: dez recursos que existem no MariaDB e não existem no MySQL Community. Exemplos escritos para MariaDB 11.4 LTS (e 11.7+ quando indicado), comparados com MySQL 8.4 LTS.
O problema
No MySQL, depois de um INSERT você chama LAST_INSERT_ID(), que devolve só o primeiro ID gerado e nenhuma outra coluna. Quer a data preenchida pelo DEFAULT, o UUID gerado ou as linhas que um DELETE apagou? Mais uma consulta, mais uma ida e volta na rede e, às vezes, uma condição de corrida.
MySQL: app ──INSERT──▶ banco app ──SELECT──▶ banco (2 viagens)
MariaDB: app ──INSERT ... RETURNING──▶ banco ──linhas──▶ app (1 viagem)
Na prática
CREATE TABLE pedidos (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
codigo UUID DEFAULT UUID(),
cliente VARCHAR(100),
criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- MariaDB 10.5+: INSERT devolvendo o que foi gerado
INSERT INTO pedidos (cliente)
VALUES ('Ana'), ('Bruno'), ('Carla')
RETURNING id, codigo, criado_em;
-- MariaDB 10.0+: DELETE devolvendo o que foi apagado
DELETE FROM pedidos
WHERE criado_em < NOW() - INTERVAL 2 YEAR
RETURNING id, cliente;
Também funciona com INSERT ... SELECT e REPLACE. Um padrão útil é "arquivar e apagar" num passo: a aplicação recebe as linhas do DELETE e grava no arquivo morto.
Fila de trabalho simples
-- Pega e remove o próximo item, numa instrução
DELETE FROM fila ORDER BY id LIMIT 1 RETURNING id, payload;
E no MySQL?
O MySQL 8.4 não tem cláusula RETURNING. O jeito é LAST_INSERT_ID() mais SELECT, ou um SELECT ... FOR UPDATE antes do DELETE, dentro de transação.
Limites
- Até a série 11.4 LTS, o
UPDATE ... RETURNINGnão existe no MariaDB (o PostgreSQL tem). - Não use subconsultas na lista do RETURNING que leiam a própria tabela alterada.
A série completa: MariaDB além do MySQL
- Tabelas temporais (System Versioning) para viajar no tempo dos dados
- Períodos de aplicação e WITHOUT OVERLAPS para reservas sem conflito
- SEQUENCE, o gerador de números que o AUTO_INCREMENT não consegue ser
- INSERT e DELETE ... RETURNING, uma ida ao banco em vez de duas
- Modo Oracle (SQL_MODE=ORACLE) para migrar PL/SQL com menos dor
- Multi-master síncrono que já vem na caixa
- Banco colunar para análise sem sair do SQL
- Sharding transparente com tabelas distribuídas
- Thread pool gratuito para milhares de conexões
- Busca vetorial com índice HNSW para IA e RAG
Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.
Quer dominar a base que os dois compartilham?
MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.
Conheça o livro e leia a degustação gratuita.
Bora trocar ideia?
Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.
Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.
Fontes: MariaDB Server Documentation (MariaDB Knowledge Base), notas de release do MariaDB Server, MySQL 8.4 Reference Manual. Imagem de capa: ilustração gerada por IA (desenvolvedor diante de monitores com código e um bumerangue sobre a mesa).