1
resposta

[Dúvida] Por que DELETE FROM faturamentoDiario ?

No trigger dado de exemplo:

CREATE TRIGGER CalculoFaturamentoDiario
AFTER INSERT ON ItensPedido
FOR EACH ROW
BEGIN
    DELETE FROM FaturamentoDiario ;
    INSERT INTO FaturamentoDiario (Dia, FaturamentoTotal)
    SELECT
     DATE(P.DataHoraPedido) AS Dia,
     SUM(IP.Quantidade * IP.PrecoUnitario) AS Faturamento
   FROM Pedidos AS P
   JOIN ItensPedido AS IP ON P.ID = IP.ID_Pedido
   GROUP BY Dia
   ORDER BY Dia;
END;

é usada a linha DELETE FROM FaturamentoDiario ; . Isso me parece meio excessivo, já que para cada nova entrada na tabela ItensPedido toda a tabela vai ser recalculada.

Procurando na internet por uma forma de fazer isso sem recalcular tudo, encontrei a clausula new, que pega os novos valores vindos do insert que ativa o trigger. Ficaria algo mais ou menos assim:

CREATE TRIGGER CalculoFaturamentoDiario
AFTER INSERT ON ItensPedido
FOR EACH ROW
BEGIN
    INSERT INTO FaturamentoDiario (Dia, FaturamentoTotal)
    SELECT 
        DATE(P.DataHoraPedido), 
        SUM(IP.Quantidade * IP.PrecoUnitario)
    FROM Pedidos P
    JOIN ItensPedido IP ON P.ID = IP.ID_Pedido
    WHERE DATE(P.DataHoraPedido) = (SELECT DATE(DataHoraPedido) FROM Pedidos WHERE ID = NEW.ID_Pedido)
    GROUP BY 1 --agrupa pela primeira coluna mencionada no select
END;

Tem algum motivo em especial pra usar o delete, ou era pra não ficar muita coisa nova na mesma aula?

1 resposta

Olá Eduardo! Tudo bem?

A ideia por trás dessa abordagem é garantir que a tabela FaturamentoDiario sempre reflita o cálculo mais recente e preciso do faturamento diário, removendo todos os dados antigos antes de inserir os novos valores calculados. Essa abordagem é interessante em momentos onde o cálculo do faturamento precisa ser refeito completamente para garantir a precisão.

Mas, como você mencionou, essa abordagem pode ser excessiva, se a tabela ItensPedido for atualizada com frequência, pois recalcular tudo pode ser ineficiente.

A sua sugestão de usar a cláusula NEW é uma boa alternativa para otimizar o processo. Ao usar NEW, você pode atualizar apenas os registros que realmente mudaram, sem a necessidade de recalcular tudo.

Portanto, no dia a dia você terá que analisar os cenários, se realmente é necessário recalcular tudo ou apenas o que foi alterado.

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Para se aprofundar no tema:
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!