CREATE TRIGGER <触发器名称>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名称>
FOR EACH ROW
<触发器SQL语句>
1.命名规则: 触发器必须有名字,最多64个字符,可能后面会附有分隔符.他和MySQL中其他对象的命名方式基本相象
2.触发时间: 触发器有执行的时间配置:能够配置为事件发生前或后
3.事件:同样也能设定触发的事件:他们能够在执行insert、update或delete的过程中触发
4.表:触发器是属于某一个表的:当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活.
我们不能给同一张表的同一个事件安排两个触发器
5.( 步长)触发间隔:触发器的执行间隔:FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不
是对整个表执行一次。
6.语句:触发器包含所要触发的SQL语句:这里的语句能够是任何合法的语句,包括复合语句,但是这里的语句
受的限制和函数的相同。
您必须拥有相当大的权限才能创建触发器(CREATE TRIGGER)。
假如您已是Root用户,那么就足够了。这跟SQL的标准有所不同。
示例:
mysql> DELIMITER //
mysql>
mysql> CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TRIGGER t22_bi
-> BEFORE INSERT ON t22
-> FOR EACH ROW
-> BEGIN
-> SET @x = 'Trigger was activated!';
-> SET NEW.s1 = 55;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> INSERT INTO t22 VALUES (1)//
Query OK, 1 row affected (0.00 sec)
让我们看假如向表t2中插入一行数据触发器对应的表会怎么样? 这里的插入的动作是很常见的,我们无需触发器的权限来执行他。甚至无需知道是否有触发器关联。
mysql> SELECT @x, t22.* FROM t22//
+------------------------+------+
| @x | s1 |
+------------------------+------+
| Trigger was activated! | 55 |
+------------------------+------+
1 row in set (0.00 sec)
mysql>
说明:
在最开始我创建了一个名字为t22的表,然后在表t22上创建了一个触发器t22_bi,当我们要向表中的行插入时,触发器就会被激活,执行将s1列的值改为55的动作。
大家能够看到INSERT动作之后的结果,和我们预期的相同,x标记被改变了,同时这里插入的数据不是我们开始输入的插入数据,而是触发器自己的数据。
对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句能够在和NEW连同OLD同时使用
事例二 当执行INSERT INTO t22 VALUES (1) 这个语句的时候向表t33里插入33数据
create table t33 (id int);
DELIMITER //
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE INSERT ON t22
FOR EACH ROW
BEGIN
insert into t33 (id)
values
(33);
END
//
INSERT INTO t22 VALUES (1)//
事例三.用NEW时候t33字段必须和t22的字段相同
create table t33 (s1 integer)
DELIMITER //
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE INSERT ON t22
FOR EACH ROW
BEGIN
insert into t33 (s1)
values
(NEW.s1);
END
//
INSERT INTO t22 VALUES (1)//
事例4.
create table t33 (s1 integer)
DELIMITER //
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE DELETE ON t22
FOR EACH ROW
BEGIN
insert into t33 (s1)
values
(OLD.s1);
END
//
INSERT INTO t22 VALUES (1)
select * from t33
delete from t22
select * from t33
事例5. update于new并用时,把新的数据存入表里.
create table t33 (s1 integer)
DELIMITER //
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE UPDATE ON t22
FOR EACH ROW
BEGIN
insert into t33 (s1)
values
(new.s1);
END
//
INSERT INTO t22 VALUES (1)//
update t22 set s1=2;
select * from t33;
事例六. update与old并用时,如果数据更新,会把旧的数据存入到表里.
create table t33 (s1 integer)
DELIMITER //
CREATE TABLE t22 (s1 INTEGER)//
CREATE TRIGGER t22_bi
BEFORE UPDATE ON t22
FOR EACH ROW
BEGIN
insert into t33 (s1)
values
(OLD.s1);
END
//
INSERT INTO t22 VALUES (1)//
select * from t33//
update t22 set s1=2//
select * from t33//
new 与:old必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row
这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;
使用insert的时候只有:new里有值;
使用delete的时候只有:old里有值;
使用update的时候:new和:old里都有值;
Database changed
mysql> show tables;
+------------------+
| Tables_in_wangzm |
+------------------+
| aa |
| bb |
| wangzm_tb |
+------------------+
3 rows in set (0.00 sec)
mysql> DELIMITER //
mysql> CREATE TRIGGER cc
-> BEFORE DELETE ON aa
-> FOR EACH ROW
-> delete from bb
-> //
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select * from bb//
+------+--------+
| id | name |
+------+--------+
| 1 | wangzm |
+------+--------+
1 row in set (0.00 sec)
mysql>
mysql> select * from aa//
+------+--------+
| id | name |
+------+--------+
| 1 | wangzm |
+------+--------+
1 row in set (0.01 sec)
mysql>
mysql>
mysql>
mysql>
mysql> delete from aa//
Query OK, 1 row affected (0.02 sec)
mysql> select * from aa//
Empty set (0.00 sec)
mysql> select * from bb//
Empty set (0.00 sec)
=====================================================================
参考文档
=====================================================================
阅读(1260) | 评论(0) | 转发(0) |