Resumo : neste tutorial, você aprenderá como criar um AFTER UPDATE
gatilho MySQL para registrar as alterações feitas em uma tabela.
Introdução aos gatilhos MySQL AFTER UPDATE
AFTER UPDATE
Os gatilhos MySQL são invocados automaticamente após a ocorrência de um evento de atualização na tabela associada aos gatilhos.
O seguinte mostra a sintaxe de criação de um AFTER UPDATE
gatilho MySQL:
CREATE TRIGGER trigger_name
AFTER UPDATE
ON table_name FOR EACH ROW
trigger_body
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
Primeiro, especifique o nome do gatilho que deseja criar na CREATE TRIGGER
cláusula.
Segundo, use AFTER UPDATE
a cláusula para especificar o horário para invocar o gatilho.
Terceiro, especifique o nome da tabela à qual o gatilho pertence após a ON
palavra-chave. O FOR EACH ROW
instrui o gatilho a disparar cada vez que uma linha é atualizada.
Finalmente, defina o corpo do gatilho que consiste em uma ou mais instruções.
Se o corpo do gatilho tiver mais de uma instrução, você precisará usar o BEGIN END
bloco. E você também precisa alterar o delimitador padrão conforme mostrado no código a seguir:
DELIMITER $$
CREATE TRIGGER trigger_name
AFTER UPDATE
ON table_name FOR EACH ROW
BEGIN
-- statements
END$$
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em um AFTER UPDATE
gatilho, você pode acessar linhas OLD
e NEW
, mas não pode atualizá-las.
Observe que the OLD
representa os valores das colunas antes de the UPDATE
, enquanto the NEW
representa os valores das colunas depois de UPDATE
.
Exemplo de gatilho MySQL AFTER UPDATE
Vejamos um exemplo de criação de um AFTER UPDATE
gatilho.
Configurando uma tabela de exemplo
Primeiro, crie uma tabela chamada Sales
:
DROP TABLE IF EXISTS Sales;
CREATE TABLE Sales (
id INT AUTO_INCREMENT,
product VARCHAR(100) NOT NULL,
quantity INT NOT NULL DEFAULT 0,
fiscalYear SMALLINT NOT NULL,
fiscalMonth TINYINT NOT NULL,
CHECK(fiscalMonth >= 1 AND fiscalMonth <= 12),
CHECK(fiscalYear BETWEEN 2000 and 2050),
CHECK (quantity >=0),
UNIQUE(product, fiscalYear, fiscalMonth),
PRIMARY KEY(id)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira dados de amostra na Sales
tabela:
INSERT INTO Sales(product, quantity, fiscalYear, fiscalMonth)
VALUES
('2001 Ferrari Enzo',140, 2021,1),
('1998 Chrysler Plymouth Prowler', 110,2021,1),
('1913 Ford Model T Speedster', 120,2021,1);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, consulte os dados da Sales
tabela para exibir seu conteúdo:
SELECT * FROM Sales;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Por fim, crie uma tabela que armazene as alterações na quantit
coluna y da sales
tabela:
DROP TABLE IF EXISTS SalesChanges;
CREATE TABLE SalesChanges (
id INT AUTO_INCREMENT PRIMARY KEY,
salesId INT,
beforeQuantity INT,
afterQuantity INT,
changedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
AFTER UPDATE
Exemplo de criação de gatilho
A instrução a seguir cria um AFTER UPDATE
gatilho na sales
tabela:
DELIMITER $$
CREATE TRIGGER after_sales_update
AFTER UPDATE
ON sales FOR EACH ROW
BEGIN
IF OLD.quantity <> new.quantity THEN
INSERT INTO SalesChanges(salesId,beforeQuantity, afterQuantity)
VALUES(old.id, old.quantity, new.quantity);
END IF;
END$$
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Este after_sales_update
gatilho é disparado automaticamente antes que ocorra um evento de atualização para cada linha da sales
tabela.
Se você atualizar o valor na quantity
coluna para um novo valor, o gatilho insere uma nova linha para registrar as alterações na SalesChanges
tabela.
Vamos examinar o gatilho em detalhes:
Primeiro, o nome do gatilho é after_sales_update
especificado na CREATE TRIGGER
cláusula:
CREATE TRIGGER after_sales_update
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em segundo lugar, o evento desencadeador é:
AFTER UPDATE
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, a tabela à qual o gatilho está associado é sales
:
ON Sales FOR EACH ROW
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Por fim, use a IF-THEN
instrução dentro do corpo do gatilho para verificar se o novo valor não é igual ao antigo e, em seguida, insira as alterações na SalesChanges
tabela:
IF OLD.quantity <> new.quantity THEN
INSERT INTO SalesChanges(salesId,beforeQuantity, afterQuantity)
VALUES(old.id, old.quantity, new.quantity);
END IF;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Testando o gatilho MySQL AFTER UPDATE
Primeiro, atualize a quantidade da linha com id 1 para 350:
UPDATE Sales
SET quantity = 350
WHERE id = 1;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O after_sales_update
foi invocado automaticamente.
Segundo, consulte os dados da SalesChanges
tabela:
SELECT * FROM SalesChanges;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, aumente a quantidade de vendas de todas as linhas para 10%:
UPDATE Sales
SET quantity = CAST(quantity * 1.1 AS UNSIGNED);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quarto, consulte os dados da SalesChanges
tabela:
SELECT * FROM SalesChanges;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O gatilho disparou três vezes devido às atualizações das três linhas.
Neste tutorial, você aprendeu como criar um AFTER UPDATE
gatilho MySQL para validar dados antes de serem atualizados em uma tabela.