MySQL ANTES do gatilho INSERT

Resumo : neste tutorial você aprenderá como criar uma BEFORE INSERTtrigger 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 INSERTgatilho 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 TRIGGERcláusula.

Segundo, use BEFORE INSERTa 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 ONpalavra-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 ENDbloco 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 INSERTgatilho você pode acessar e alterar os NEWvalores. No entanto, você não pode acessar os OLDvalores porque OLDobviamente os valores não existem.

MySQL ANTES do gatilho INSERT

Exemplo de gatilho MySQL BEFORE INSERT

Criaremos um BEFORE INSERTgatilho 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 WorkCenterStatsque 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 INSERTExemplo de criação de gatilho

O acionador a seguir atualiza a capacidade total da WorkCenterStatstabela antes que um novo centro de trabalho seja inserido na WorkCentertabela:

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_insertespecificado na CREATE TRIGGERclá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 WorkCenterstabela:

ON WorkCenters FOR EACH ROWLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Finalmente, dentro do corpo do gatilho, verificamos qualquer linha da WorkCenterStatstabela.

Se a tabela WorkCenterStatstiver uma linha, o gatilho adiciona a capacidade à totalCapacitycoluna. Caso contrário, insere uma nova linha na WorkCenterStatstabela.

Testando o BEFORE INSERTgatilho MySQL

Primeiro, insira uma nova linha na WorkCentertabela:

INSERT INTO WorkCenters(name, capacity)
VALUES('Mold Machine',100);
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, consulte os dados da WorkCenterStatstabela:

SELECT * FROM WorkCenterStats;    
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

O gatilho foi invocado e inseriu uma nova linha na WorkCenterStatstabela.

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 )
Exemplo 2 do gatilho MySQL BEFORE INSERT

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

Neste tutorial, você aprendeu como criar um BEFORE INSERTgatilho MySQL para manter uma tabela de resumo de outra tabela.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *