类似tp里面的数据模型回调接口,在数据表增删改的前或后触发执行其他的预订的sql;

一个触发器要具备4要素:

1.监视地点 -- 要执行触发器的表

2.监视事件 -- 由什么DML事件来牵引

3.触发时间 -- 是在DML事件发生的前或后

4.触发事件 -- 要触发执行的预订sql,也是DML

创建触发器

create trigger <触发器名称>
{ before | after}
{insert | update | delete}
on <表名>
for each row
<触发器SQL语句>

实例

-- 创建练习需要用的两张表
CREATE TABLE `orders` (
`oid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`gid` tinyint(4) DEFAULT NULL,
`num` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`oid`),
KEY `gid` (`gid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `goods` (
`gid` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`gname` varchar(100) NOT NULL DEFAULT '',
`stock` smallint(5) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`gid`),
KEY `stock` (`stock`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- 为商品表插入数据
INSERT INTO `goods`(`gname`,`stock`) VALUES('电脑',45),('自行车',50),('汽车',100),('手机',500); -- 创建触发器 tg1,监视订单表,当订单表增加订单时,商品表就得减少;
DELIMITER $
CREATE TRIGGER `tg1`
AFTER INSERT ON `orders` -- 在订单表发生插入时
FOR EACH ROW -- 每一行数据的插入都要触发TRIGGER
BEGIN -- 开始书写预订要被触发的SQL
UPDATE `goods` SET `stock` = `stock` - `new`.`num` WHERE `gid` = `new`.`gid`; -- new.num就是新增的订单表row的值;由于此处预订的sql是以分号结尾,所以再创建trigger之初就得把mysql默认的分号结束符改为其他的,否则mysql就会以为到此句就结束,于是报错;
END $
DELIMITER ; -- 更改回来; -- 创建触发器 tg2,监视订单表,当订单被删掉时,商品表增加;
DELIMITER $
CREATE TRIGGER `tg2`
AFTER DELETE ON `orders`
FOR EACH ROW
BEGIN
UPDATE `goods` SET `stock` = `stock` + `old`.`num` WHERE `gid` = `old`.`gid`;
END $
DELIMITER ; -- 创建触发器 tg3,监视订单表,在订单增加前判断是否大于5,如果大于5,就让其等于5(限购5个);
DELIMITER $
CREATE TRIGGER `tg3`
BEFORE INSERT ON `orders`
FOR EACH ROW
BEGIN
IF `new`.`num` > 5
THEN
SET `new`.`num` = 5;
END IF;-- 在begin内每句要执行的sql都要带分号结束,这一个判断语句其实是指定了两句sql
UPDATE `goods` SET `stock` = `stock` - `new`.`num` WHERE `gid` = `new`.`gid`;
END $
DELIMITER ;

项目中用到实例

delimiter $
CREATE TRIGGER sum_rebate_tg
after update on sc_supplier_rebate
for each row
begin
if new.is_confirm = 1
then
set @fl = new.consume_discount + new.recommend_discount;
update sc_supplier_average_score set sum_rebate = @fl where supplier_id = new.supplier_id;
elseif new.is_confirm = 0
THEN
update sc_supplier_average_score set sum_rebate = 0 where supplier_id = new.supplier_id;
end if;
end $
delimiter ;

关于new和old

  • INSERT 和 DELETE 事件只能用old代表原来的列值集合,用点语法取出每列的值,如old.num(取出以前num列里面的值)
  • 在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
  • 用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。
  • 在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。

删除触发器

DROP TRIGGER [schema_name.]trigger_name

舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。

DROP TRIGGER test.num

【mysql的编程专题】触发器的更多相关文章

  1. 【mysql的编程专题①】流程控制与其他语法

    流程控制与内置函数,一般用在select的field字段上,或者用在函数,存储过程,触发器中; 如果用在select上就会随着query出来的row来隐式迭代; 注释与语句结束符 语句结束符 默认有两 ...

  2. 【mysql的编程专题⑤】自定义函数

    用户自定义函数(user-defined function,UDF) 是一种对mysql的扩展途径,其用法与内置函数相同 创建自定义函数 语法 create function function_nam ...

  3. 【mysql的编程专题④】存储过程

    类似函数,但是没有返回值,把sql进行封装,便于多次使用或多种应用程序共享使用.不能用在SQL语句中,只能使用CALL调用; 创建存储过程 语法 CREATE PROCEDURE sp_name ([ ...

  4. 【mysql的编程专题③】内置函数

    数学函数 常用 abs(x) 返回x的绝对值 floor(x) 返回小于x的最大整数值 mod(x,y) 返回x/y的模(余数) rand() 返回0到1内的随机值,可以通过提供一个参数(种子)使ra ...

  5. 【mysql的编程专题⑥】视图

    视图是表的一个映射,是一张虚表,在结构上视图和普通的表没什么区别,一样可以用sql语句来增删改查; 视图创建后是一直存在数据库内 操作 创建视图 语法 CREATE [ALGORITHM]={UNDE ...

  6. 《MySQL 存储过程编程》-读书笔记

    本书结构: 第一部分:存储编程基础 第1章:存储过程程序基础 第2章:MySQL存储编程指南 第3章:语言基础 第4章:语句块 第5章:在存储程序中使用SQL 第一章:MySQL存储程序介绍 存储程序 ...

  7. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  8. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

  9. MYSQL数据库学习八 触发器的操作

    8.1 触发器 在表发生更改时,自动进行一些处理.例如,学生表中每增加一条关于学生记录时,学生的总数就必须同时改变,同时需要检查电话号码格式是否正确,地址缩写是否正确. 以下语句会激活触发器: DEL ...

随机推荐

  1. SequoiaDB数据库的一般概念介绍

    SequoiaDB数据库的主要对象包括文档.集合.集合空间与索引等. 文档 SequoiaDB中的文档为JSON格式,一般又被称为记录.在数据库内部使用BSON,即二进制的方式存放JSON数据.一般情 ...

  2. WordPress 主题开发 - (五)WordPress 主题模板及目录结构 待翻译

    While the most minimal of WordPress Themes really only need an index.php template and a style.css fi ...

  3. 基于PinnedSectionListView实现联系人通讯录并且点击打电话

    PinnedSectionListView具体下载地址.使用方法和注意事项:http://www.cnblogs.com/zzw1994/p/4997601.html 怎么根据联系人姓名首字符顺序读取 ...

  4. select标签用法

    <select name="type" class="textarea" onchange='bbbb(this.value)' > <opt ...

  5. sqlalchemy - day1

    一.Create engine Database url规则: dialect+driver://username:password@host:port/database echo: True表示cm ...

  6. 使用IO流创建文件并写入数据

    /* 字符流和字节流: 字节流两个基类: InputStream OutputStream 字符流两个基类: Reader Writer 既然IO流是用于操作数据的, 那么数据的最常见体现形式是:文件 ...

  7. telnet 时代的 bbs

    人类曾经用telnet 来访问 bbs,后来有了www,web 浏览器取代了telnet Telnet协议是TCP/IP协议族中的一员 arp和ping的区别 ping也属于一个通信协议,是TCP/I ...

  8. centos crontab 定时任务详解

    安装crontab: yum install crontabs 说明: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 ...

  9. ios显示艺术字字体颜色渐变

    UIColor * myColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"123.jpg"]]; self. ...

  10. Extjs4 使用store的post方法

    Extjs4 使用store的post方法 引用官网的一句话 Now when we call store.load(), the AjaxProxy springs into action, mak ...