关于MySQL触发器的问题


本文摘自PHP中文网,作者一个新手,侵删。

trigger

Mysql中触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

有时在改变表的的某些数据,同时也希望其他相关表中的数据也改变,利用触发器就能满足这样的需求。运用触发器不公可以简化程序,而且可以增加程序的灵活性。

创建触发器语法如下:

1

2

3

4

5

6

7

8

create trigger  name(触发器名称)

after/befor(触发时间)

insert/update/delete(触发事件,当填写其中一种,其它的操作不会激活触发器)

on (监视的表,即在哪张表上建立触发器 )

for each row (行级触发器)

begin

(sql语句,希望改变的数据,可写多条语句,每条语句必须用 ; 结尾)

end;

以上sql语句写上 ; 后就会执行,触发器未写完报错!

这时就会用到 DELIMITER 命令(delimiter 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法 为:

DELIMITER ;;(可以把mysql的结束标识设为其它的符号,如 ;; 或 $ 还可以设为多个长度)

在这之后的语句,以分号结束触发器不会有什么反应,只有遇到了 ;;,才认为是结束语句。注意:使用完之后,要记得把它修改回来!

假设系统中有两个表:
商品表 goods(商品ID gid, 商品名称 goods_name,商品数量 goods_num)
订单表 ord(订单oid ,商品ID gid,订单数量 goods_much )
要创建触发器来使商品表中的商品数量随着订单表的订单数量自动更新,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

delmiter $

#判断库存是否足够

create trigger t1

before

insert

on ord

for each row

begin

#声明变量

declare

goods_num int;

select num into goods_num from goods where gid = new.gid;

#判断

if new.much > goods_num then

    set new.much = goods_num;

end if;

update goods set num = num - new.much where gid=new.gid

end$

delmiter ;

MySQL 中使用 declare 来定义一局部变量,该变量只能在 BEGIN … END 复合语句中使用,并且应该定义在复合语句的开头,

上述示例中使用了NEW关键字,和 MS SQL Server 中的 INSERTED 和 DELETED 类似,MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。
具体地:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;

以上就是关于MySQL触发器的问题的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

mysql添加用户可访问不了怎么办

如何解决mysql 1075错误

php数据库连接mysqlmysqli的区别与用法

怎么删mysql的注册表?

在activereports中如何使用mysql数据库

怎么删除数据表中数据

mysql中i/o出现错误问题原因及解决方案(附优化建议)

mysql的innodb引擎入门学习教程

mysql服务无法启动怎么解决

mysql服务器连接过程浅析

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...