Resumo : neste tutorial você aprenderá como criar uma BEFORE INSERT
trigger MySQL para manter uma tabela resumo de outra tabela.
Introdução aos gatilhos MySQL BEFORE INSERT
BEFORE INSERT
Os gatilhos do MySQL são acionados automaticamente antes que um evento de inserção ocorra na tabela.
O seguinte ilustra a sintaxe básica de criação de um BEFORE INSERT
gatilho MySQL:
CREATE TRIGGER trigger_name
BEFORE INSERT
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 BEFORE INSERT
a cláusula para especificar o horário para invocar o gatilho.
Terceiro, especifique o nome da tabela à qual o gatilho está associado após a ON
palavra-chave.
Por fim, especifique o corpo do gatilho que contém uma ou mais instruções SQL que são executadas quando o gatilho é invocado.
Se você tiver várias instruções no arquivo trigger_body
, deverá usar o BEGIN END
bloco e alterar o delimitador padrão :
DELIMITER $$
CREATE TRIGGER trigger_name
BEFORE INSERT
ON table_name FOR EACH ROW
BEGIN
-- statements
END$$
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Observe que em um BEFORE INSERT
gatilho você pode acessar e alterar os NEW
valores. No entanto, você não pode acessar os OLD
valores porque OLD
obviamente os valores não existem.
Exemplo de gatilho MySQL BEFORE INSERT
Criaremos um BEFORE INSERT
gatilho para manter uma tabela de resumo de outra tabela.
Configurando uma tabela de exemplo
Primeiro, crie uma nova tabela chamada WorkCenters
:
DROP TABLE IF EXISTS WorkCenters;
CREATE TABLE WorkCenters (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
capacity INT NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, crie outra tabela chamada WorkCenterStats
que armazena o resumo da capacidade dos centros de trabalho:
DROP TABLE IF EXISTS WorkCenterStats;
CREATE TABLE WorkCenterStats(
totalCapacity INT NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
BEFORE INSERT
Exemplo de criação de gatilho
O acionador a seguir atualiza a capacidade total da WorkCenterStats
tabela antes que um novo centro de trabalho seja inserido na WorkCenter
tabela:
DELIMITER $$
CREATE TRIGGER before_workcenters_insert
BEFORE INSERT
ON WorkCenters FOR EACH ROW
BEGIN
DECLARE rowcount INT;
SELECT COUNT(*)
INTO rowcount
FROM WorkCenterStats;
IF rowcount > 0 THEN
UPDATE WorkCenterStats
SET totalCapacity = totalCapacity + new.capacity;
ELSE
INSERT INTO WorkCenterStats(totalCapacity)
VALUES(new.capacity);
END IF;
END $$
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Neste gatilho:
Primeiro, o nome do gatilho é before_workcenters_insert
especificado na CREATE TRIGGER
cláusula:
CREATE TRIGGER before_workcenters_insert
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Em segundo lugar, o evento desencadeador é:
BEFORE INSERT
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, a tabela à qual o gatilho está associado é a WorkCenters
tabela:
ON WorkCenters FOR EACH ROW
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Finalmente, dentro do corpo do gatilho, verificamos qualquer linha da WorkCenterStats
tabela.
Se a tabela WorkCenterStats
tiver uma linha, o gatilho adiciona a capacidade à totalCapacity
coluna. Caso contrário, insere uma nova linha na WorkCenterStats
tabela.
Testando o BEFORE INSERT
gatilho MySQL
Primeiro, insira uma nova linha na WorkCenter
tabela:
INSERT INTO WorkCenters(name, capacity)
VALUES('Mold Machine',100);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, consulte os dados da WorkCenterStats
tabela:
SELECT * FROM WorkCenterStats;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O gatilho foi invocado e inseriu uma nova linha na WorkCenterStats
tabela.
Terceiro, insira um novo centro de trabalho:
INSERT INTO WorkCenters(name, capacity)
VALUES('Packing',200);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Por fim, consulte os dados de WorkCenterStats
:
SELECT * FROM WorkCenterStats;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O gatilho atualizou a capacidade total de 100 para 200 conforme esperado.
Observe que para manter adequadamente a tabela de resumo WorkCenterStats
, você também deve criar gatilhos para lidar com eventos de atualização e exclusão na WorkCenters
tabela.
Neste tutorial, você aprendeu como criar um BEFORE INSERT
gatilho MySQL para manter uma tabela de resumo de outra tabela.