← Voltar ao blog
MariaDB 22 de outubro de 2026 5 min de leitura

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.

MariaDB: INSERT e DELETE ... RETURNING, uma ida ao banco em vez de duas

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 ... RETURNING nã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

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).