TransWikia.com

¿Cuál es la forma correcta de crear un trigger que actualice una fila y no todas las filas al momento de insertar un registro?

Stack Overflow en español Asked on December 18, 2021

Con un trigger en la tabla DetalleCompras quiero actualizar el campo stock de una fila particular en la tabla Productos.

Tabla DETALLECOMPRAS

En esta tabla inserto la cantidad de productos a comprar en el campo del mismo nombre CANTIDAD

Tabla PRODUCTOS

En esta tabla en el campo STOCK quiero sumar la cantidad de la tabla detallecompras pero, al hacerlo, me suma la cantidad para todas las filas y no, por ejemplo, solo para la fila donde esta 'PANADOL'.

Tenia una cantidad de 10 en stock para cada registro y al hacer dos inserciones de 10 solo para PANADOL se sumaron a los otros dos registros, entonces lo que quiero es evitar que se sume para los demás registros y solo lo haga para un solo registro, espero darme a entender.

Mi trigger actual es:

DELIMITER $$
    CREATE TRIGGER SumarStock
    AFTER INSERT ON detallecompras 
    FOR EACH ROW BEGIN
    UPDATE productos SET stock= stock + new.cantidad
    WHERE codproducto` = codproducto;
    END;
    $$

One Answer

El error está en la cláusula where de la sentencia update del trigger.

WHERE codproducto = codproducto 

Dado que no calificas los campos, y que solo hay una tabla en la sentencia, esto es equivalente a:

WHERE productos.codproducto = productos.codproducto 

Acá estás pidiendo al motor que, para cada fila de la tabla productos compare el valor de la columna codproducto consigo mismo. Todas las filas de la tabla, excepto las que tengan null en esa columna, cumplirán con esa condición.

Pero lo que tu quieres es comparar el valor del campo codproducto en la tabla productos con el insertado en la tabla detallecompras. Para ello haces referencia al registro que se está insertando con el pseudo registro New, que tiene los valores que tomó el registro recién insertado, como ya lo haces para tomar el valor del campo cantidad.

create trigger SumarStock
after insert on DetalleCompras 
for each row
begin
  update productos 
     set stock= stock + new.cantidad
   where productos.codproducto = new.codproducto;
end;

Para evitar ambigüedades, he calificado ambos nombres de campo, así se verá con total claridad cual es mi intención, tanto para un programador, como para el motor.

Estoy asumiendo que el campo en la tabla DetalleCompras que hace referencia al producto se llama codproducto, pues no se ve en tu pregunta. Si no es así, ajusta tu el código.

Answered by jachguate on December 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP