2013-11-02 70 views
0

如何將下面的這些觸發器保存到一個觸發器中?如何設置mysql多觸發器

我試過了,但我不確定我在做什麼錯誤?

下面是我觸發的

  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; 
    

回答

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之後的那個)。

0

MySQL不支持的一個觸發所有例如像SQL服務器做的操作。

你這樣做你必須在MySQL中。

如果您希望集中代碼,您可以創建一個過程並使用NEW/OLD信息和事件標識符(I/U/D)從3個不同的觸發器中調用相同的過程。