Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294494
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -10
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-05 09:11
文章分类
文章存档

2015年(1)

2014年(6)

2013年(8)

2012年(1)

2011年(6)

2010年(2)

2009年(16)

2008年(44)

我的朋友

分类: Mysql/postgreSQL

2008-06-22 11:04:05

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) |
给主人留下些什么吧!~~