您的位置:首页 > 其它

触发程序

2015-11-02 19:56 375 查看

1.CREATETRIGGER语法

CREATETRIGGERtrigger_nametrigger_timetrigger_event

ONtbl_nameFOREACHROWtrigger_stmt

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOADDATA和REPLACE语句。

·UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

·DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

2.[b]“BEGIN...END复合语句”直接上程序[/b]

1.先创建4个数据表

CREATETABLEtest1(a1INT);
CREATETABLEtest2(a2INT);
CREATETABLEtest3(a3INTNOTNULLAUTO_INCREMENTPRIMARYKEY);//表三的a3为主码,自增
CREATETABLEtest4(
a4INTNOTNULLAUTO_INCREMENTPRIMARYKEY,
b4INTDEFAULT0//表4的b4默认都为0
);


2.触发器testref的定义

DELIMITER|

CREATETRIGGERtestrefBEFOREINSERTONtest1
FOREACHROWBEGIN
INSERTINTOtest2SETa2=NEW.a1;//把数据表1的数据复制到数据表2
DELETEFROMtest3WHEREa3=NEW.a1;//删除数据表3中与表1相同的数据
UPDATEtest4SETb4=b4+1WHEREa4=NEW.a1;//把数据表4b4的相应内容在原基础上加1,条件为与表1a1相同的数据项
END
|

DELIMITER;


3.给表3,表4插入数据。

INSERTINTOtest3(a3)VALUES
(NULL),(NULL),(NULL),(NULL),(NULL),
(NULL),(NULL),(NULL),(NULL),(NULL);


INSERTINTOtest4(a4)VALUES
(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);


如果将下述值插入表test1,如下所示:

mysql>INSERTINTOtest1VALUES

->(1),(3),(1),(7),(1),(8),(4),(4);

QueryOK,8rowsaffected(0.01sec)

Records:8Duplicates:0Warnings:0

那么4个表中的数据如下:

mysql>SELECT*FROMtest1;

+------+

|a1|

+------+

|1|

|3|

|1|

|7|

|1|

|8|

|4|

|4|

+------+

8rowsinset(0.00sec)


mysql>SELECT*FROMtest2;

+------+

|a2|

+------+

|1|

|3|

|1|

|7|

|1|

|8|

|4|

|4|

+------+

8rowsinset(0.00sec)


mysql>SELECT*FROMtest3;

+----+

|a3|

+----+

|2|

|5|

|6|

|9|

|10|

+----+

5rowsinset(0.00sec)


mysql>SELECT*FROMtest4;

+----+------+

|a4|b4|

+----+------+

|1|3|

|2|0|

|3|1|

|4|2|

|5|0|

|6|0|

|7|1|

|8|1|

|9|0|

|10|0|

+----+------+

10rowsinset(0.00sec)

使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.col_name在更新或删除它之前,引用已有行中的1列。NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。

激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: