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;
