今天研究了半天,終于得到正確的結果,和大家分享分享!
查了一下官網(wǎng):
mysql創(chuàng)建觸發(fā)器:CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt觸發(fā)程序是與表有關的命名數(shù)據(jù)庫對象,當表上出現(xiàn)特定事件時,將激活該對象。
觸發(fā)程序與命名為tbl_name的表相關。tbl_name必須引用永久性表。不能將觸發(fā)程序與TEMPORARY表或視圖關聯(lián)起來。
trigger_time是觸發(fā)程序的動作時間。它可以是BEFORE或AFTER,以指明觸發(fā)程序是在激活它的語句之前或之后觸發(fā)。
trigger_event指明了激活觸發(fā)程序的語句的類型。trigger_event可以是下述值之一:
· INSERT:將新行插入表時激活觸發(fā)程序,例如,通過INSERT、LOAD DATA和REPLACE語句。
· UPDATE:更改某一行時激活觸發(fā)程序,例如,通過UPDATE語句。
· DELETE:從表中刪除某一行時激活觸發(fā)程序,例如,通過DELETE和REPLACE語句。
請注意,trigger_event與以表操作方式激活觸發(fā)程序的SQL語句并不很類似,這點很重要。例如,關于INSERT的BEFORE觸發(fā)程序不僅能被INSERT語句激活,也能被LOAD DATA語句激活。
可能會造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...語法:BEFORE INSERT觸發(fā)程序對于每一行將激活,后跟AFTER INSERT觸發(fā)程序,或BEFORE UPDATE和AFTER UPDATE觸發(fā)程序,具體情況取決于行上是否有重復鍵。
對于具有相同觸發(fā)程序動作時間和事件的給定表,不能有兩個觸發(fā)程序。例如,對于某一表,不能有兩個BEFORE UPDATE觸發(fā)程序。但可以有1個BEFORE UPDATE觸發(fā)程序和1個BEFORE INSERT觸發(fā)程序,或1個BEFORE UPDATE觸發(fā)程序和1個AFTER UPDATE觸發(fā)程序。
trigger_stmt是當觸發(fā)程序激活時執(zhí)行的語句。如果你打算執(zhí)行多個語句,可使用BEGIN ... END復合語句結構。這樣,就能使用存儲子程序中允許的相同語句
我有數(shù)據(jù)庫netshop和shopserver,兩個數(shù)據(jù)庫中分別有order表,要保證兩個表同步更新(插入和刪除),主要實現(xiàn)如下:
插入數(shù)據(jù)同步更新
drop trigger orderinsert;
create trigger orderinsert before insert on orders
for each row
begin
insert into shopserver.orders set
shopserver.orders.orderid = NEW.orderid ,
shopserver.orders.userid = NEW.userid,
shopserver.orders.orderdate = NEW.orderdate,
shopserver.orders.address = NEW.address,
shopserver.orders.contactman = NEW.contactman,
shopserver.orders.postcode = NEW.postcode,
shopserver.orders.ordersum = NEW.ordersum,
shopserver.orders.dealdate = NEW.dealdate,
shopserver.orders.status = NEW.status,
shopserver.orders.note = NEW.note ;
end;
刪除數(shù)據(jù)同步更新
create trigger orderdelete after delete on orders
for each row
begin
delete from shopserver.orders
where shopserver.orders.orderid = OLD.orderid ;
end;