在MySql中创建事件表触发器

时间:2014-04-12 04:38:16

标签: mysql

我想在主表中进行更新和删除时为事件表创建一个触发器。我有两个表一个是主要的,另一个是事件表。如果主表中的任何更改(更新和删除)插入到事件表中的旧记录。

fld_id  fld_name    fld_date    fld_logid
1   vino            12/4/2014   4
2   arun            12/4/2014   4


fld_id  p_table_id  fld_name    fld_date    fld_logid
1           1           vino            12/4/2014   4
2           1           vino            12/4/2014   4
3           1           vino            12/4/2014   4
4           1           vino            12/4/2014   4
5           2           arun            12/4/2014   4
6           2           arun            12/4/2014   4

1 个答案:

答案 0 :(得分:0)

  

如果主表中的任何更改(如更新和删除)插入到事件表中的旧记录。

您可以在after delete上定义primary_table触发器,以记录delete次操作 并在after update上定义primary_table触发器以记录update次操作。

我不确定您的确切要求,但如果要记录这些操作,那么在operation_type中有datetimeevent_table字段会很好记录事件类型和发生时间。

如果表中未定义此类字段,您可以按如下所示添加:

alter table event_table 
    add column event_type enum( 'delete', 'update' ) not null default 2
  , add column event_time datetime default current_timestamp

假设有这样的字段,我建议关注trigger s 如果不需要此字段,您可以注释掉该字段。

示例1: 删除后

drop trigger if exists ad_on_primary_table;

delimiter //

create trigger ad_on_primary_table
         after delete 
            on primary_table
for each row
begin
  insert 
    into event_table ( p_table_id, fld_name, fld_date, fld_logid
                       , event_type, event_time
         )
  values ( OLD.fld_id, OLD.fld_name, OLD.fld_date, OLD.fld_logid
           , 'delete', current_timestamp -- 'delete' is @ index 1 in enum
           -- or use the following
           -- , 1, current_timestamp -- 1 is index of 'delete' in enum
         );
end;
//

示例2: 更新后

drop trigger if exists au_on_primary_table;

delimiter //

create trigger au_on_primary_table
         after update
            on primary_table
for each row
begin
  insert 
    into event_table ( p_table_id, fld_name, fld_date, fld_logid
                       , event_type, event_time
         )
  values ( OLD.fld_id, OLD.fld_name, OLD.fld_date, OLD.fld_logid
           , 'update', current_timestamp -- 'update' is @ index 2 in enum
           -- or use the following
           -- , 2, current_timestamp -- 2 is index of 'update' in enum
         );
end;
//