¿Qué son exactamente los activadores de MySQL? MySQL crea un disparador (CREAR DISPARADOR)

Los desencadenadores de MySQL, al igual que los procedimientos almacenados, son programas integrados en MySQL y son herramientas poderosas para la gestión de datos en MySQL. La diferencia es que la ejecución del procedimiento almacenado requiere el uso de la instrucción CALL, mientras que la ejecución del disparador no requiere el uso de la instrucción CALL ni necesita iniciarse manualmente, sino que se activa y activa. a través de operaciones relacionadas en la tabla de datos para lograr la ejecución. Por ejemplo, se activará cuando se realice una operación (INSERT, BORRAR o ACTUALIZAR) en la tabla de estudiantes.

Los activadores están estrechamente relacionados con las tablas de datos y se utilizan principalmente para proteger los datos de las tablas. Especialmente cuando hay varias tablas relacionadas entre sí, los activadores pueden mantener la coherencia de los datos en diferentes tablas.

En MySQL, los disparadores solo se pueden activar al realizar operaciones INSERT, UPDATE y DELETE, y otras declaraciones SQL no activarán los disparadores.

Entonces, ¿por qué utilizar desencadenantes? Por ejemplo, cuando desarrollamos proyectos, a menudo nos encontramos con las siguientes situaciones:

  • Cuando se agrega un registro sobre un estudiante a la tabla de estudiantes, el número total de estudiantes también debe cambiar.
  • Al agregar un registro de estudiante, debe verificar si la edad cumple con los requisitos del rango.
  • Al eliminar la información de un estudiante, se debe eliminar el registro correspondiente en la hoja de calificaciones.
  • Cuando se elimina un dato, se debe conservar una copia de seguridad en la tabla de archivo de la base de datos.

 
Aunque la lógica empresarial implementada en las situaciones anteriores es diferente, todas necesitan realizar algún procesamiento automáticamente cuando cambia la tabla de datos. En este momento, se puede utilizar el procesamiento de activación. Por ejemplo, para el primer caso, puede crear un objeto desencadenante y realizar una operación para calcular el número total de estudiantes cada vez que se agrega un registro de estudiante. Esto garantiza que cada vez que se agrega un registro de estudiante, el número total de estudiantes y el número de expedientes de los estudiantes son consistentes.

Ventajas y desventajas de los desencadenantes

Las ventajas de los desencadenantes son las siguientes:

  • La ejecución del disparador es automática y se ejecuta inmediatamente después de que se realizan las modificaciones correspondientes a los datos de la tabla relacionada con el disparador.
  • Los activadores pueden implementar comprobaciones y operaciones más complejas que las restricciones FOREIGN KEY y las restricciones CHECK.
  • Los activadores pueden implementar cambios en cascada en los datos de la tabla, asegurando la integridad de los datos hasta cierto punto.


Las desventajas de los desencadenantes son las siguientes:

  • La lógica empresarial implementada mediante desencadenadores es difícil de localizar cuando ocurren problemas, especialmente cuando hay múltiples desencadenantes involucrados, lo que dificulta el mantenimiento posterior.
  • El uso extensivo de activadores puede alterar fácilmente la estructura del código y aumentar la complejidad del programa.
  • Si la cantidad de datos que deben cambiarse es grande, la eficiencia de ejecución del disparador será muy baja.

Disparadores soportados por MySQL

En el uso real, MySQL admite tres activadores: INSERTAR, ACTUALIZAR y ELIMINAR.

1) INSERTAR disparador

Un disparador que responde antes o después de que se ejecute una instrucción INSERT.

Al utilizar activadores INSERT, debe prestar atención a los siguientes puntos:

  • Dentro del código de activación INSERT, se puede hacer referencia a una tabla virtual denominada NEW (no distingue entre mayúsculas y minúsculas) para acceder a la fila insertada.
  • En el disparador BEFORE INSERT también se puede actualizar el valor en NEW, lo que permite cambiar el valor insertado (siempre que tenga los permisos de operación correspondientes).
  • Para la columna AUTO_INCREMENT, NEW contiene el valor 0 antes de que se ejecute INSERT y contendrá el nuevo valor generado automáticamente después de que se ejecute INSERT.
2) ACTUALIZAR activador

Un disparador que responde antes o después de que se ejecute una instrucción UPDATE.

Al utilizar activadores de ACTUALIZAR, debe prestar atención a los siguientes puntos:

  • Dentro del código de activación ACTUALIZAR, se puede hacer referencia a una tabla virtual denominada NUEVA (no distingue entre mayúsculas y minúsculas) para acceder al valor actualizado.
  • Dentro del código de activación UPDATE, se puede hacer referencia a una tabla virtual denominada OLD (no distingue entre mayúsculas y minúsculas) para acceder al valor antes de que se ejecutara la instrucción UPDATE.
  • En un disparador ANTES DE ACTUALIZAR, el valor en NUEVO también puede actualizarse, lo que permite cambios en el valor que se utilizará en la declaración ACTUALIZAR (siempre que tenga los permisos de operación correspondientes).
  • Todos los valores en OLD son de solo lectura y no se pueden actualizar.


Nota: Cuando el activador está diseñado para activar la operación de actualización de la tabla en sí, solo se pueden utilizar activadores de tipo ANTES y no se permitirán activadores de tipo DESPUÉS.

3) ELIMINAR disparador

Un disparador que responde antes o después de que se ejecute una declaración DELETE.

Al utilizar el activador DELETE, debe prestar atención a los siguientes puntos:

  • Dentro del código de activación DELETE, se puede hacer referencia a una tabla virtual denominada OLD (no distingue entre mayúsculas y minúsculas) para acceder a las filas eliminadas.
  • Todos los valores en OLD son de solo lectura y no se pueden actualizar.


En términos generales, MySQL manejará los errores de la siguiente manera durante el uso del disparador.

Para las tablas transaccionales, si el activador falla y, como resultado, toda la declaración falla, todos los cambios realizados por la declaración se revertirán; para las tablas no transaccionales, dicha reversión no se puede realizar incluso si la declaración falla. estar en vigor.

Si el disparador ANTES falla, MySQL no realizará la operación en la fila correspondiente.

Si se produce un error durante la ejecución de un disparador ANTES o DESPUÉS, toda la declaración que llama al disparador fallará.

MySQL ejecutará el disparador DESPUÉS solo si tanto el disparador ANTES como la operación de fila se han ejecutado con éxito.

MySQL crea un disparador (CREAR DISPARADOR)

Los disparadores son objetos de base de datos relacionados con  tablas de datos MySQL  , se activan cuando se cumplen las condiciones definidas y ejecutan el conjunto de declaraciones definidas en el disparador. Esta característica de los activadores puede ayudar a las aplicaciones a garantizar la integridad de los datos en el lado de la base de datos.

Práctica completa de habilidades básicas de base de datos MySQL icono-default.png?t=N7T8https://edu.csdn.net/course/detail/36210

gramática básica

En MySQL 5.7, los disparadores se pueden crear usando la instrucción CREATE TRIGGER.

El formato de sintaxis es el siguiente:

CREATE <触发器名> < BEFORE | AFTER >
<INSERT | UPDATE | DELETE >
ON <表名> FOR EACH Row<触发器主体>

La sintaxis se explica a continuación.

1) Nombre del activador

El nombre del activador. El activador debe tener un nombre único en la base de datos actual. Si está creando en una base de datos específica, el nombre debe estar precedido por el nombre de la base de datos.

2) INSERTAR | ACTUALIZACIÓN | BORRAR

Evento desencadenante, utilizado para especificar el tipo de declaración que activa el desencadenante.

Nota: Los tiempos de ejecución de los tres activadores son los siguientes.

  • INSERT: Disparador que se activa cuando se inserta una nueva fila en la tabla. Por ejemplo, el disparador BEFORE de INSERT se puede activar no solo mediante la instrucción INSERT de MySQL, sino también mediante la instrucción LOAD DATA.
  • ELIMINAR: los activadores se activan cuando se elimina una fila de datos de la tabla, como las declaraciones ELIMINAR y REEMPLAZAR.
  • ACTUALIZACIÓN: un disparador se activa cuando se cambia una fila de datos en la tabla, como una declaración de ACTUALIZACIÓN.
3) ANTES | DESPUÉS

ANTES y DESPUÉS, momento en que se dispara el gatillo, indique si el gatillo se dispara antes o después de la declaración que lo activa. Si desea verificar si los nuevos datos cumplen con las condiciones, use la opción ANTES; si desea completar varios o más cambios después de ejecutar la declaración que activa el disparador, generalmente usa la opción DESPUÉS.

4) nombre de la tabla

El nombre de la tabla a la que está asociado el activador. Esta tabla debe ser una tabla permanente. El activador no puede asociarse a una tabla o vista temporal. El disparador se activa cuando ocurre un evento desencadenante en la mesa. Una misma mesa no puede tener dos disparadores con el mismo tiempo de disparo y evento. Por ejemplo, para una tabla de datos, no puede haber dos activadores ANTES DE ACTUALIZAR al mismo tiempo, pero puede haber un activador ANTES DE ACTUALIZAR y un activador ANTES DE INSERTAR, o un activador ANTES DE ACTUALIZAR y un activador DESPUÉS DE ACTUALIZAR.

5) cuerpo del gatillo

El cuerpo de la acción del disparador contiene la declaración MySQL que se ejecutará cuando se active el disparador. Si desea ejecutar varias declaraciones, puede utilizar la estructura de declaración compuesta BEGIN…END.

6) PARA CADA FILA

Generalmente se refiere a la activación a nivel de fila, donde la acción de activación debe activarse para cada fila afectada por el evento desencadenante. Por ejemplo, cuando se utiliza la instrucción INSERT para insertar varias filas de datos en una tabla, el activador realizará las acciones de activación correspondientes para cada fila de datos insertada.

注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。

Además, en MySQL, si necesita ver los activadores existentes en la base de datos, puede utilizar la instrucción SHOW TRIGGERS.

Crear un disparador de tipo ANTES

En la base de datos test_db, la tabla de datos tb_emp8 es una tabla de información de los empleados, que incluye los campos de identificación, nombre, ID de departamento y salario. La estructura de la tabla de datos tb_emp8 es la siguiente.

mysql> SELECT * FROM tb_emp8;
Empty set (0.07 sec)
mysql> DESC tb_emp8;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(22) | YES  | UNI | NULL    |       |
| deptId | int(11)     | NO   | MUL | NULL    |       |
| salary | float       | YES  |     | 0       |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.05 sec)

[Ejemplo 1] Cree un activador llamado SumOfSalary. La condición del activador es sumar los valores del campo de salario recién insertados antes de insertar datos en la tabla de datos tb_emp8. La declaración SQL de entrada y el proceso de ejecución son los siguientes.

mysql> CREATE TRIGGER SumOfSalary
    -> BEFORE INSERT ON tb_emp8
    -> FOR EACH ROW
    -> SET @sum=@sum+NEW.salary;
Query OK, 0 rows affected (0.35 sec)

Después de crear el activador SumOfSalary, cuando se inserta un registro en la tabla tb_emp8, el valor de suma definido cambia de 0 a 1500, es decir, la suma de los valores insertados 1000 y 500, como se muestra a continuación.

SET @sum=0;
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO tb_emp8
    -> VALUES(1,'A',1,1000),(2,'B',1,500);
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> SELECT @sum;
+------+
| @sum |
+------+
| 1500 |
+------+
1 row in set (0.03 sec)

Crear disparador de tipo DESPUÉS

En la base de datos test_db, las tablas de datos tb_emp6 y tb_emp7 son tablas de información de empleados, incluidos los campos de identificación, nombre, ID de departamento y salario. Las estructuras de las tablas de datos tb_emp6 y tb_emp7 son las siguientes.

mysql> SELECT * FROM tb_emp6;
Empty set (0.07 sec)
mysql> SELECT * FROM tb_emp7;
Empty set (0.03 sec)
mysql> DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float       | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> DESC tb_emp7;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  |     | NULL    |       |
| salary | float       | YES  |     | 0       |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.04 sec)

[Ejemplo 2] Cree un activador llamado double_salary. La condición del activador es que después de insertar datos en la tabla de datos tb_emp6, los mismos datos se inserten en la tabla de datos tb_emp7 y el salario es 2 del valor del campo de salario recién insertado en tb_emp6. veces. La declaración SQL de entrada y el proceso de ejecución son los siguientes.

mysql> CREATE TRIGGER double_salary
    -> AFTER INSERT ON tb_emp6
    -> FOR EACH ROW
    -> INSERT INTO tb_emp7
    -> VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);
Query OK, 0 rows affected (0.25 sec)

Después de crear el activador double_salary, cuando se inserta un registro en la tabla tb_emp6, el mismo registro se inserta en la tabla tb_emp7 al mismo tiempo y el campo de salario tiene el doble del valor del campo de salario en tb_emp6, como se muestra a continuación.

mysql> INSERT INTO tb_emp6
    -> VALUES (1,'A',1,1000),(2,'B',1,500);
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM tb_emp6;
+----+------+--------+--------+
| id | name | deptId | salary |
+----+------+--------+--------+
|  1 | A    |      1 |   1000 |
|  2 | B    |      1 |    500 |
+----+------+--------+--------+
3 rows in set (0.04 sec)
mysql> SELECT * FROM tb_emp7;
+----+------+--------+--------+
| id | name | deptId | salary |
+----+------+--------+--------+
|  1 | A    |      1 |   2000 |
|  2 | B    |      1 |   1000 |
+----+------+--------+--------+
2 rows in set (0.06 sec)

Capacitación práctica de base de datos mysql de ingeniero senior de bases de datos de Dachang icono-default.png?t=N7T8https://edu.csdn.net/course/detail/39021

Supongo que te gusta

Origin blog.csdn.net/m0_37449634/article/details/135553488
Recomendado
Clasificación