MySQL触发器

来源:互联网 发布:ubuntu unmount 编辑:程序博客网 时间:2024/04/28 12:50

触发器在数据库系统开发过程中具有非常重要的作用,例如可以防止有害数据录入数据库,可以改变或取消insert、update和delete语句的执行及在一个会话中监听数据库中的数据的改变。

实例263:创建触发器

这是一个创建触发器的实例
录像位置:光盘/mingrisoft/09/263

实例说明

如果用户打算在数据库中通过触发器实现某一动作的监听,那么首先应该创建触发器,触发器是在“命令提示符”下创建的,如图9.16所示。

技术要点

MySQL数据库创建触发器的格式如下:

create trigger <触发器名称>
{ before | after}
{insert | update | delete}
on <表名>
for each row
<触发器SQL语句>

create trigger <触发器名称>:创建一个新触发器,并指定触发器的名称。
{ before | after}:用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。
on <表名>:用于指定响应该触发器的表名。
for each row:触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>:触发器要执行的SQL语句,如果该触发器要执行多条SQL语句,要将多条语句放在begin…end块中。

实现过程

(1)在“命令提示符”下创建数据表tb_test。代码如下:

create table tb_test(t_id varchar(20),t_name varchar(20)) 

(2)将换行标记转换为“//”。代码如下:
delimiter // 

(3)创建触发器,实现无论用户向表tb_test添加什么数据都使字段t_name的内容为“mrsoft”。代码如下:
create trigger test_tri
before insert on tb_test
for each row
set new.t_name='mrsoft'

(4)向表tb_test添加一条记录,并查看添加后的结果。代码如下:
insert into tb_test(t_id,t_name) values('mr0001', '123')//
select * from tb_test

 

 

在MySQL数据库中,创建触发器前应先查看数据库中的触发器,这样既可以使开发人员对指定的数据库中的所有触发器及功能有一个直观的把握,而且又可以避免创建同名或类似功能的触发器。运行本实例,如图9.17所示,首先在图中的文本框中输入要查看触发器的数据库,然后单击“查看”按钮,即可将该数据库中所有的触发器的详细信息显示出来。

 

 

技术要点

查看MySQL数据库中的触发器详细信息,可以通过如下语句实现:

show triggers
使用show triggers语句前应先指明要查看的数据库。
实现过程

(1)选择要查看触发器的数据库。代码如下:

$dbname=

 

 

 

 

 

 

CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。

--你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。

2、简单实例:

example1:

--创建表tab1
DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(
    tab1_id varchar(11)
);

--创建表tab2
DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(
    tab2_id varchar(11)
);

--创建触发器:t_afterinsert_on_tab1
--作用:增加tab1表记录后自动将记录增加到tab2表中
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1;
CREATE TRIGGER t_afterinsert_on_tab1
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
     insert into tab2(tab2_id) values(new.tab1_id);
END;

--测试一下
INSERT INTO tab1(tab1_id) values('0001');

--看看结果
SELECT * FROM tab1;
SELECT * FROM tab2;

example2:

--创建触发器:t_afterdelete_on_tab1
--作用:删除tab1表记录后自动将tab2表中对应的记录删去
DROP TRIGGER IF EXISTS t_afterdelete_on_tab1;
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
      delete from tab2 where tab2_id=old.tab1_id;
END;

--测试一下
DELETE FROM tab1 WHERE tab1_id='0001';
--看看结果
SELECT * FROM tab1;
SELECT * FROM tab2;

 

 

 

 
有2张表:

表1:device, 里面有最主要的2个字段(id, device_type, .....),表明了"设备类型"与"ID";

表2:alarm_information,记录了每种设备的告警信息,其中有2个主要字段(id, device_type, ....);

要求:当 device中的某项被删除的时候,alarm_information中该设备所有的告警信息全部被删除。

在device中创建触发器:

///////////////////////////////////////////////////////////////////////////////////////////////

create   trigger   update_alarm_information   before delete   on   device  
  for   each   row  

begin    
  set   @id=OLD.id; //保存被删除设备的“id”

  set   @dtype=OLD.device_type;  //保存被删除记录的“device_type”
  delete   from   alarm_information   where   id=@id and device_type = @dtype;  
end;

///////////////////////////////////////////////////////////////////////////////////////////////

如果用Navicat for Mysql创建触发器就更加方便了

首先选择表device,点击右键,在弹出菜单中选择“设计表”
选择“触发器”

 

 


3.  在定义框中写入:

begin    
  set   @id=OLD.id; //保存被删除设备的“id”

  set   @dtype=OLD.device_type;  //保存被删除记录的“device_type”
  delete   from   alarm_information   where   id=@id and device_type = @dtype;  
end;

4.  完成


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xxben/archive/2009/08/05/4413294.aspx