语法:
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的标准有所不同。
例子1:
创建两个表tab1和tab2
CREATE TABLE IF NOT EXISTS `tab1` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(250) DEFAULT NULL,
`times` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;
CREATE TABLE IF NOT EXISTS `tab2` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(250) DEFAULT NULL,
`times` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;
创建触发器:t_insert_on_tab2
作用:增加tab1表记录后自动将记录增加到tab2表中
DROP
TRIGGER
IF EXISTS
t_insert_on_tab2;
CREATE
TRIGGER
t_insert_on_tab2AFTER
INSERT
ON
tab1
FOR
EACH ROW
BEGIN
insert into tab2(username) values(NEW.username);
END
;
测试一下:
INSERT
INTO
tab1(tab1_id)
values
(
'0001'
);
查看两个表:
SELECT
*
FROM
tab1;
SELECT
*
FROM
tab2;
例子2:教学网 eduyo.com
创建触发器: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.id;
END
;
测试一下
DELETE
FROM
tab1
WHERE
id=
'0001'
;
看看结果SELECT
*
FROM
tab1;
SELECT
*
FROM
tab2;
注:
1、 使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.id在更新或删除它之前,引用已有行中的1列,是否可以引
用old与trigger_time无关,NEW.username在更新它之后引用将要插入的新行的1列或已有行的1列。
INSERT:只可引用NEW、DELETE:只可引用OLD、 UPDATE:可以引用NEW或OLD。
2、激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列, 需要具
有UPDATE权限。
3、CREATE TRIGGER语句需要SUPER权限。
4、show triggers\G 显示数据库中所有触发器。
5、对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。
6、触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL
7、触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或ROLLBACK。
DROP TRIGGER [schema_name.]trigger_name