mysql数据库触发器详解
2012-10-30 13:37
204 查看
2.1 Mysql触发器的基本使用
创建触发器。创建触发器语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
其中trigger_name标识触发器名称,用户自行指定;
trigger_time标识触发时机,用before和after替换;
trigger_event标识触发事件,用insert,update和delete替换;
tbl_name标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt是触发器程序体;触发器程序可以使用begin和end作为开始和结束,中间包含多条语句;
下面给出sfrd一个触发器实例:
CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_useracct_update
AFTER UPDATE
ON SF_User.useracct FOR EACH ROW
BEGIN
IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN
IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN
if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN
INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
end if;
ELSE
INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
END IF;
END IF;
END;
上述触发器实例使用了OLD关键字和NEW关键字。OLD和NEW可以引用触发器所在表的某一列,在上述实例中,OLD.ulevelid表示表SF_User.useracct修改之前ulevelid列的值,NEW.ulevelid表示表SF_User.useracct修改之后ulevelid列的值。另外,如果是insert型触发器,NEW.ulevelid也表示表SF_User.useracct新增行的ulevelid列值;如果是delete型触发器OLD.ulevelid也表示表SF_User.useracct删除行的ulevelid列原值。
另外,OLD列是只读的,NEW列则可以在触发器程序中再次赋值。
上述实例也使用了IF,THEN ,ELSE,END IF等关键字。在触发器程序体中,在beigin和end之间,可以使用顺序,判断,循环等语句,实现一般程序需要的逻辑功能。
查看触发器。查看触发器语法如下,如果知道触发器所在数据库,以及触发器名称等具体信息:
SHOW TRIGGERS from SF_User like "usermaps%"; //查看SF_User库上名称和usermaps%匹配的触发器
如果不了解触发器的具体的信息,或者需要查看数据库上所有触发器,如下:
SHOW TRIGGERS; //查看所有触发器
举例:
//添加
CREATE TRIGGER trig_insert_user
AFTER INSERT
ON test.ttt FOR EACH ROW
BEGIN
INSERT into ttt.user set username=NEW.name;
END
//删除
CREATE TRIGGER trig_delete_user
AFTER DELETE
ON test.ttt FOR EACH ROW
BEGIN
DELETE from ttt.user where username=OLD.name;
END
//更新
CREATE TRIGGER trig_update_user
AFTER UPDATE
ON test.ttt FOR EACH ROW
BEGIN
UPDATE ttt.user set username=NEW.name where
username=OLD.name;
END
在导入triggers时有时会报1064错误,这些,处理是在上限制符,示例如下:
如上,添加红色的部份后,正常运行
PS: http://www.2cto.com/database/201202/120797.html
创建触发器。创建触发器语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
其中trigger_name标识触发器名称,用户自行指定;
trigger_time标识触发时机,用before和after替换;
trigger_event标识触发事件,用insert,update和delete替换;
tbl_name标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt是触发器程序体;触发器程序可以使用begin和end作为开始和结束,中间包含多条语句;
下面给出sfrd一个触发器实例:
CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_useracct_update
AFTER UPDATE
ON SF_User.useracct FOR EACH ROW
BEGIN
IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN
IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN
if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN
INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
end if;
ELSE
INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
END IF;
END IF;
END;
上述触发器实例使用了OLD关键字和NEW关键字。OLD和NEW可以引用触发器所在表的某一列,在上述实例中,OLD.ulevelid表示表SF_User.useracct修改之前ulevelid列的值,NEW.ulevelid表示表SF_User.useracct修改之后ulevelid列的值。另外,如果是insert型触发器,NEW.ulevelid也表示表SF_User.useracct新增行的ulevelid列值;如果是delete型触发器OLD.ulevelid也表示表SF_User.useracct删除行的ulevelid列原值。
另外,OLD列是只读的,NEW列则可以在触发器程序中再次赋值。
上述实例也使用了IF,THEN ,ELSE,END IF等关键字。在触发器程序体中,在beigin和end之间,可以使用顺序,判断,循环等语句,实现一般程序需要的逻辑功能。
查看触发器。查看触发器语法如下,如果知道触发器所在数据库,以及触发器名称等具体信息:
SHOW TRIGGERS from SF_User like "usermaps%"; //查看SF_User库上名称和usermaps%匹配的触发器
如果不了解触发器的具体的信息,或者需要查看数据库上所有触发器,如下:
SHOW TRIGGERS; //查看所有触发器
举例:
//添加
CREATE TRIGGER trig_insert_user
AFTER INSERT
ON test.ttt FOR EACH ROW
BEGIN
INSERT into ttt.user set username=NEW.name;
END
//删除
CREATE TRIGGER trig_delete_user
AFTER DELETE
ON test.ttt FOR EACH ROW
BEGIN
DELETE from ttt.user where username=OLD.name;
END
//更新
CREATE TRIGGER trig_update_user
AFTER UPDATE
ON test.ttt FOR EACH ROW
BEGIN
UPDATE ttt.user set username=NEW.name where
username=OLD.name;
END
在导入triggers时有时会报1064错误,这些,处理是在上限制符,示例如下:
delimiter $$ CREATE TRIGGER trig_radcheck_delete_user AFTER DELETE ON isec5.userinfo FOR EACH ROW BEGIN DELETE from isec5.radcheck where username=OLD.username; END $$
如上,添加红色的部份后,正常运行
PS: http://www.2cto.com/database/201202/120797.html
相关文章推荐
- mysql数据库触发器详解
- MySQL数据库InnoDB数据恢复工具的使用小结详解
- 图文详解|手把手教你Linux部署tomcat项目<二> Linux下安装MySql数据库
- mysql数据库表间内外链接详解
- 触发器deleted 表和 inserted 表详解
- mysql数据库SELECT使用详解
- win10MySQL数据库安装与配置详解
- mysql数据库 触发器
- 详解远程连接Mysql数据库的问题(ERROR 2003 (HY000) 111)
- vs2008 C++项目连接mysql数据库详解
- mysql数据库数据改变监控 触发器 游标 new. old. java监控比对 最终是在后端java进行比对
- 详解MariaDB数据库的触发器
- oracle 视图 存储过程 触发器详解
- Mysql数据库中的触发器操作
- Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)
- MySQL数据库函数详解(2)
- MySQL数据库(5)_MySQL数据库视图、触发器
- jenkins构建触发器详解-不登录触发远程构建详解
- PHP4与MySQL数据库操作函数详解(五)