| Listado completo de tutoriales 112 - Disparadores (triggers - delete trigger) | 
Hemos visto en conceptos anteriores la creación de disparadores cuando se ejecutan los comandos insert y update. Ahora veremos con un ejemplo como asociar un trigger a una tabla para cuando se ejecuta el comando delete.
Una librería almacena los datos de sus libros en una tabla denominada "libros" y en otra tabla llamada "ventas", las ventas de los mismos.
Borramos las tablas "libros" y "ventas" si existen:
drop table if exists ventas; drop table if exists libros;
Creamos las dos tablas con las siguientes estructuras:
create table libros( codigo int auto_increment, titulo varchar(50), autor varchar(50), editorial varchar(30), precio float, stock int, primary key (codigo) ); create table ventas( numero int auto_increment, codigolibro int, precio float, cantidad int, primary key (numero) );
Insertamos algunas filas de prueba en la tabla "libros":
 insert into libros(titulo, autor, editorial, precio, stock)
  values('Uno','Richard Bach','Planeta',15,100);   
 insert into libros(titulo, autor, editorial, precio, stock)
  values('Ilusiones','Richard Bach','Planeta',18,50);
 insert into libros(titulo, autor, editorial, precio, stock)
  values('El aleph','Borges','Emece',25,200);
 insert into libros(titulo, autor, editorial, precio, stock)
  values('Aprenda PHP','Mario Molina','Emece',45,200);
Del concepto anterior creamos nuevamente el disparador cuando se produce una venta para disminuir el stock de libros:
 drop trigger if exists before_ventas_insert;  
 delimiter //
 create trigger before_ventas_insert
   before insert
   on ventas
   for each row
 begin
   update libros set stock=libros.stock-new.cantidad
     where new.codigolibro=libros.codigo; 
 end //
 delimiter ;
Creamos un nuevo disparador para actualizar el campo "stock" de la tabla "libros" cuando se elimina un registro de la tabla "ventas" (por ejemplo, si el comprador devuelve el o los libros comprados):
 drop trigger if exists before_ventas_delete;  
  
 delimiter //
 create trigger before_ventas_delete
   before delete
   on ventas
   for each row
 begin
  update libros set stock=libros.stock+old.cantidad
     where old.codigolibro=libros.codigo;   
 end //
 delimiter ;
Procedemos a efectuar una venta y luego controlar que se ha reducido en 1 el stock de dicho libro en la tabla 'libros':
insert into ventas(codigolibro, precio, cantidad) values(1, 15, 1); select * from libros;
Finalmente eliminamos la fila de la tabla 'ventas' por la devolución del libros, nuevamente podemos ver que gracias a la ejecución del trigger 'before_ventas_delete' se ha incrementado el stock en la tabla 'libros':
delete from ventas where numero=1; select * from libros;
