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?