如何设置mysql多触发器

时间:2013-11-02 00:51:27

标签: mysql sql triggers

如何将这些触发器保持在单个触发器中?

我试过了,但我不确定我在做什么错误?

以下是我的触发器

  1. create trigger Disminuir_Existencia1
    after insert
    on detalle 
    for each row 
    update producto set existencia =
                             existencia-new.Cantidad
                           where id_p=new.id_p
    
  2. create trigger Aumentar_Existencia
    after insert
    on detalle
    for each row    
    
    update producto set existencia =if( new.activo = 0, producto.existencia +
     new.cantidad,producto.existencia)
    
    where new.id_P = producto.id_P
    
  3. CREATE TRIGGER aumentar
    AFTER insert
    on detalle
    for each row
    
    update factura set total =
     ( 
         select producto.precio * new.cantidad
        from producto 
        where new.id_p=producto.id_p)
    
     where new.Folio= factura.folio;
    

2 个答案:

答案 0 :(得分:1)

在您的情况下,正确的解决方案可能取决于您已经尝试过的内容以及尝试的结果。

例如,您可能只需要将UPDATE语句括在BEGIN ... END中,这就足够了:

create trigger CombinedDetalleInsertTrigger
after insert
on detalle 
for each row 
begin
  update ... where id_p=new.id_p;

  update ... where new.id_P = producto.id_P;

  update ... where new.Folio= factura.folio;
end;

this answer suggests

但是,在许多情况下,您还需要使用DELIMITER指令:

delimiter $$

create trigger CombinedDetalleInsertTrigger
after insert
on detalle 
for each row 
begin
  update ... where id_p=new.id_p;

  update ... where new.id_P = producto.id_P;

  update ... where new.Folio= factura.folio;
end$$

delimiter ;

this answer中所述。

尽管如此,可能并不总是可以使用DELIMITER,因为这是客户端指令rather than a MySQL statement,并非所有MySQL客户端都支持它。在这种情况下,您可以尝试遵循this answer的建议:使用allowMultiQueries=true连接属性或删除最终;end之后的那个)。

答案 1 :(得分:0)

Mysql不支持所有操作的一个触发器,例如sql-server。

你正在以mysql的方式进行。

如果您希望集中代码,您可以使用NEW / OLD信息和事件标识符(I / U / D)从3个不同的触发器创建一个过程并调用相同的过程。