create trigger 触发器名 before|after 触发事件insert|ddelete|update on 表名 for each row
begin
触发器程序体
end
# for each row:触发器执行间隔,表示每一行执行一次动作,而不是针对整个表执行一次;
这时候当执行insert操作影响几行时total会自增加几,
当执行update影响几行时total就会自减几,因为for each row表示每一行执行一次动作就执行一次触发器
查看触发器
MariaDB [my_test]> show triggers\G;
MariaDB [my_test]> \d $ # 将mysql结束符临时改为$
当emp雇员增加时emp_total表中的total数加一,且自动更新到emp2表
MariaDB [my_test]> create trigger emp_total_trigger1 after insert on emp for each row
-> begin
-> update emp_total set total=total+1;
-> insert into emp2 values(new.empno,new.ename,new.job,new.mgp,new.hiredate,new.sal,new.comm,new.deptno);
-> end$
Query OK, 0 rows affected (0.01 sec)
当emp雇员减少时时emp_total表中的total数减一
MariaDB [my_test]> create trigger emp_total_trigger2 before delete on emp for each row
-> begin
-> update emp_total set total=total-1;
-> end$
Query OK, 0 rows affected (0.04 sec)
emp表中的数据删除后,还自动将emp2表中的对应数据删除
MariaDB [my_test]> create trigger emp_total_trigger3 before delete on emp for each row
begin
delete from emp2 where empno=old.empno; # 这种删除更新一定要使用主键
update emp_total set total=total-1;
end$
注:mariadb尚不支持“一个表具有相同操作时间和事件的多个触发器”,此触发器会和上面delete事件触发器的冲突,删除一个即可
当emp表中的ename改变之后,emp2表中的enamel也随着改变
MariaDB [my_test]> create trigger emp_total_trigger3 before update on emp for each row
-> begin
-> update emp2 set ename=new.ename where ename=old.ename;
-> end$