GNU/Linux >> Tutoriales Linux >  >> Cent OS

Cómo usar disparadores de MySQL

Introducción

Los activadores de MySQL aplican restricciones a las tablas al agregar, actualizar o eliminar filas de tablas.

Las columnas en MySQL aplican una pequeña cantidad de limitaciones de valor. Por ejemplo, establecer un tipo de datos de columna como tiny int y no nulo requiere una entrada de valor de número pequeño. Aún así, se necesitan más restricciones para mantener la integridad de los datos.

Este tutorial le muestra cómo usar los disparadores de MySQL y proporciona ejemplos para cada tipo de disparador.

Requisitos previos

  • Un sistema que ejecuta MySQL en un servidor de base de datos
  • Cuenta de usuario MySQL con privilegios de root
  • Conocimiento de los comandos básicos de MySQL (consulte nuestra hoja de trucos descargable de comandos de MySQL)

¿Qué es un disparador en MySQL?

Un disparador es un objeto MySQL con nombre que se activa cuando ocurre un evento en una tabla. Los disparadores son un tipo particular de procedimiento almacenado asociado con una tabla específica.

Los activadores permiten el acceso a los valores de la tabla con fines comparativos mediante NEW y OLD . La disponibilidad de los modificadores depende del evento activador que utilice:

Verificar o modificar un valor al intentar insertar datos hace que NEW.<column name> modificador disponible. Esto se debe a que una tabla se actualiza con contenido nuevo. Por el contrario, un OLD.<column name> el valor no existe para una declaración de inserción porque no existe información en su lugar de antemano.

Al actualizar una fila de la tabla, ambos modificadores están disponibles. Hay OLD.<colum name> datos que queremos actualizar a NEW.<column name> datos.

Finalmente, al eliminar una fila de datos, OLD.<column name> modificador accede al valor eliminado. El NEW.<column name> no existe porque nada está reemplazando el valor anterior al eliminarlo.

Ejemplo de activación de MySQL

Como ejemplo de un disparador aplicado, insertando nuevos valores en la tabla person produce un resultado diferente al de la entrada original:

Observe que los nombres insertados estaban inicialmente en minúsculas. Al seleccionar la tabla, la primera letra se muestra en mayúscula. Aunque no hay indicios de nada diferente a una declaración de inserción normal, el disparador se disparó antes de la declaración de inserción para poner en mayúscula la primera letra del nombre.

Uso de activadores de MySQL

Cada disparador asociado con una tabla tiene un nombre y una función únicos basados ​​en dos factores:

1. Tiempo . BEFORE o AFTER un evento de fila específico.

2. Evento . INSERT , UPDATE o DELETE .

Los disparadores de MySQL se disparan según el tiempo de activación y el evento para un total de seis combinaciones de disparadores únicas. Las declaraciones anteriores ayudan a verificar los datos y realizar cambios antes de realizar compromisos, mientras que las declaraciones posteriores confirman los datos primero y luego ejecutan las declaraciones.

La ejecución de un conjunto de acciones ocurre automáticamente y afecta a todas las filas insertadas, eliminadas o actualizadas en la instrucción.

Crear disparadores

Usa el CREATE TRIGGER sintaxis de sentencia para crear un nuevo disparador:

CREATE TRIGGER <trigger name> <trigger time > <trigger event>
ON <table name>
FOR EACH ROW
<trigger body>;

La mejor práctica es nombrar el disparador con la siguiente información:

<trigger time>_<table name>_<trigger event>

Por ejemplo, si un disparador se activa antes de insertar en una mesa llamada empleado , la mejor convención es llamar al activador:

before_employee_insert

Alternativamente, una práctica común es usar el siguiente formato:

<table name>_<first letter of trigger time><first letter of trigger name>

El antes de insertar nombre desencadenante para la tabla empleado se parece a esto:

employee_bi

El activador se ejecuta en un momento específico de un evento en una tabla definida por

Evento desencadenante ANTIGUO NUEVO
INSERTAR No
ACTUALIZAR
ELIMINAR No
para cada fila afectada por la función.

Eliminar activadores

Para eliminar un disparador, use el DROP TRIGGER declaración:

DROP TRIGGER <trigger name>;

Alternativamente, use:

DROP TRIGGER IF EXISTS <trigger name>;

El mensaje de error no aparece porque no hay activador, por lo que no se imprime ninguna advertencia.

Crear base de datos de ejemplo

Cree una base de datos para los códigos de ejemplo de activación con la siguiente estructura:

1. Cree una tabla llamada persona con nombre y edad para columnas.

CREATE TABLE person (name varchar(45), age int);

Inserte datos de muestra en la tabla:

INSERT INTO person VALUES ('Matthew', 25), ('Mark', 20);

Seleccione la tabla para ver el resultado:

SELECT * FROM person;

2. Cree una tabla llamada average_age con una columna llamada promedio :

CREATE TABLE average_age (average double);

Inserte el valor de edad promedio en la tabla:

INSERT INTO average_age SELECT AVG(age) FROM person;

Seleccione la tabla para ver el resultado:

SELECT * FROM average_age;

3. Cree una tabla llamada person_archive con nombre , edad y tiempo columnas:

CREATE TABLE person_archive (
name varchar(45),
age int,
time timestamp DEFAULT NOW());

Crear un activador ANTES DE INSERTAR

Para crear un BEFORE INSERT disparador, usa:

CREATE TRIGGER <trigger name> BEFORE INSERT
ON <table name>
FOR EACH ROW
<trigger body>;

El BEFORE INSERT trigger da control sobre la modificación de datos antes de confirmar en una tabla de base de datos. Usar mayúsculas para mantener la coherencia, verificar la longitud de una entrada o detectar entradas defectuosas con BEFORE INSERT los disparadores proporcionan además limitaciones de valor antes de ingresar nuevos datos.

ANTES DE INSERTAR Ejemplo de activación

Cree un BEFORE INSERT activador para verificar el valor de edad antes de insertar datos en la persona tabla:

delimiter //
CREATE TRIGGER person_bi BEFORE INSERT
ON person
FOR EACH ROW
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Person must be older than 18.';
END IF; //
delimiter ;

La inserción de datos activa el activador y comprueba el valor de age antes de enviar la información:

INSERT INTO person VALUES ('John', 14);

La consola muestra el mensaje de error descriptivo. Los datos no se insertan en la tabla debido a que falló la verificación del disparador.

Crear un disparador DESPUÉS DE INSERTAR

Crear un AFTER INSERT desencadenar con:

CREATE TRIGGER <trigger name> AFTER INSERT
ON <table name>
FOR EACH ROW
<trigger body>;

El AFTER INSERT el disparador es útil cuando la fila ingresada genera un valor necesario para actualizar otra tabla.

Ejemplo de activador DESPUÉS DE INSERTAR

Insertar una nueva fila en la persona la tabla no actualiza automáticamente el promedio en el average_age mesa. Crear un AFTER INSERT activar en la persona tabla para actualizar el average_age tabla después de insertar:

delimiter //
CREATE TRIGGER person_ai AFTER INSERT
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(age) FROM person); //
delimiter ;

Insertar una nueva fila en la persona table activa el gatillo:

INSERT INTO person VALUES ('John', 19);

Los datos se confirman con éxito en la persona tabla y actualiza el average_age tabla con el valor medio correcto.

Crear un disparador ANTES DE ACTUALIZAR

Haga un BEFORE UPDATE desencadenar con:

CREATE TRIGGER <trigger name> BEFORE UPDATE
ON <table name>
FOR EACH ROW
<trigger body>;

El BEFORE UPDATE los disparadores van junto con BEFORE INSERT disparadores Si existen restricciones antes de insertar datos, los límites también deben estar allí antes de actualizar.

Ejemplo de activación ANTES DE LA ACTUALIZACIÓN

Si hay una restricción de edad para la persona tabla antes de insertar datos, la restricción de edad también debe existir antes de actualizar la información. Sin BEFORE UPDATE disparador, el disparador de verificación de edad es fácil de evitar. Nada restringe la edición a un valor defectuoso.

Agregue un BEFORE UPDATE disparador a la persona tabla con el mismo cuerpo que BEFORE INSERT disparador:

delimiter //
CREATE TRIGGER person_bu BEFORE UPDATE
ON person
FOR EACH ROW
IF NEW.age < 18 THEN
SIGNAL SQLSTATE '50002' SET MESSAGE_TEXT = 'Person must be older than 18.';
END IF; //
delimiter ;

Al actualizar un valor existente, se activa la verificación del disparador:

UPDATE person SET age = 17 WHERE name = 'John';

Actualización de la edad a un valor inferior a 18 muestra el mensaje de error y la información no se actualiza.

Crear un activador DESPUÉS DE LA ACTUALIZACIÓN

Use el siguiente bloque de código para crear un AFTER UPDATE disparador:

CREATE TRIGGER <trigger name> AFTER UPDATE
ON <table name>
FOR EACH ROW
<trigger body>;

El AFTER UPDATE trigger ayuda a realizar un seguimiento de los cambios realizados en los datos. La mayoría de las veces, cualquier cambio después de insertar información también ocurre después de actualizar los datos.

Ejemplo de activación DESPUÉS DE ACTUALIZAR

Cualquier actualización exitosa de la edad datos en la tabla persona también debe actualizar el valor promedio intermedio calculado en el average_age mesa.

Crea un AFTER UPDATE activador para actualizar el average_age tabla después de actualizar una fila en la persona tabla:

delimiter //
CREATE TRIGGER person_au AFTER UPDATE
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(age) FROM person); //
delimiter ;

Actualizar los datos existentes cambia el valor en la persona tabla:

UPDATE person SET age = 21 WHERE name = 'John';

Actualizando la tabla persona también actualiza el promedio en el average_age mesa.

Crear un disparador ANTES DE ELIMINAR

Para crear un BEFORE DELETE disparador, usa:

CREATE TRIGGER <trigger name> BEFORE DELETE
ON <table name>
FOR EACH ROW
<trigger body>;

BEFORE DELETE disparador es esencial por razones de seguridad. Si una tabla principal tiene elementos secundarios adjuntos, el activador ayuda a bloquear la eliminación y evita las tablas huérfanas. El activador también permite archivar datos antes de eliminarlos.

Ejemplo de activador ANTES DE ELIMINAR

Archive los datos eliminados creando un BEFORE DELETE gatillo en la mesa persona e inserte los valores en el person_archive tabla:

delimiter //
CREATE TRIGGER person_bd BEFORE DELETE
ON person
FOR EACH ROW
INSERT INTO person_archive (name, age)
VALUES (OLD.name, OLD.age); //
delimiter ;

Eliminación de datos de la tabla persona archiva los datos en person_archive tabla antes de eliminar:

DELETE FROM person WHERE name = 'John';

Insertar el valor de nuevo en la persona table mantiene el registro de los datos eliminados en el person_archive tabla:

INSERT INTO person VALUES ('John', 21);

BEFORE DELETE trigger es útil para registrar cualquier intento de cambio de tabla.

Crear un disparador DESPUÉS DE ELIMINAR

Haz un AFTER DELETE desencadenar con:

CREATE TRIGGER <trigger name> AFTER DELETE
ON <table name>
FOR EACH ROW
<trigger body>;

El AFTER DELETE los activadores mantienen actualizaciones de información que requieren que la fila de datos desaparezca antes de realizar las actualizaciones.

Ejemplo de activador DESPUÉS DE ELIMINAR

Crear un AFTER DELETE gatillo en la mesa persona para actualizar el average_age tabla con la nueva información:

delimiter //
CREATE TRIGGER person_ad AFTER DELETE
ON person
FOR EACH ROW
UPDATE average_age SET average = (SELECT AVG(person.age) FROM person); //
delimiter ;

Eliminación de un registro de la tabla persona actualiza el average_age tabla con el nuevo promedio:

Sin AFTER DELETE activador, la información no se actualiza automáticamente.

Crear disparadores múltiples

MySQL no admite que se activen varios disparadores al mismo tiempo. Sin embargo, es posible agregar varias operaciones lógicas al mismo disparador. Usa el BEGIN y END delimitadores para indicar el cuerpo del disparador:

CREATE TRIGGER <trigger name> <trigger time > <trigger event>
ON <table name>
FOR EACH ROW
BEGIN
<trigger body>;
END;

Asegúrese de cambiar el delimitador predeterminado antes de crear un activador con varias operaciones.

Mostrar disparadores

Enumere todos los disparadores en una base de datos con:

SHOW triggers;

El resultado muestra una lista de todos los activadores, incluido el nombre y el contenido de la instrucción:

También se muestra otra información, como la hora de creación y el usuario que creó el disparador.


Cent OS
  1. Cómo crear una base de datos MySQL en Workbench

  2. Cómo usar phpMyAdmin para copiar una base de datos MySQL

  3. Cómo usar sal en Centos 8

  4. Cómo reparar una tabla de base de datos Mysql dañada

  5. Cómo instalar y usar MySQL en Ubuntu 20.04

Cómo usar las funciones de cadena de MySQL

Cómo instalar y usar MySQL Workbench en Ubuntu 18.04

Cómo instalar MySQL en CentOS 8

¡¡¡Cómo utilizar el Panel Webuzo!!!

Cómo instalar y usar SQLite en Ubuntu 20.04

Cómo usar la herramienta MySQL Optimize