mysql trigger 触发器
创建触发器:
CREATE
[DEFINER = {user|CURRENT_USER}]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
语法中:
trigger_name:触发器的名称,不能与已经存在的触发器重复; trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发; trigger_event::{ INSERT |UPDATE | DELETE },触发该触发器的具体事件; tbl_name:该触发器作用在tbl_name上;
实例:
创建简单确发器
<1> 准备学生表和学生数目统计表
mysql> CREATE TABLE student_info (
-> stu_no INT(11) NOT NULL AUTO_INCREMENT,
-> stu_name VARCHAR(255) DEFAULT NULL,
-> PRIMARY KEY (stu_no)
-> );
mysql> CREATE TABLE student_count(
-> student_count INT(11) DEFAULT 0
-> );
插入一条数据:
mysql> INSERT INTO student_count VALUES(0);
<2> 创建简单触发器,在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少
http://blog.csdn.net/goskalrie/article/details/53020631
mysql> CREATE TRIGGER trigger_student_count_insert
-> AFTER INSERT
-> ON student_count FOR EACH ROW
-> UPDATE student_count SET student_count=student_count+1;
mysql> CREATE TRIGGER trigger_student_count_insert
-> AFTER INSERT
-> ON student_info FOR EACH ROW
-> UPDATE student_count SET student_count=student_count+1; mysql> CREATE TRIGGER trigger_student_count_delete
-> AFTER DELETE
-> ON student_info FOR EACH ROW
-> UPDATE student_count SET student_count=student_count-1;
<3> INSERT、DELETE数据,查看触发器是否正常工作
mysql> INSERT INTO student_info VALUES(NULL,'xiaoc'),(NULL,'xiaoz'),(NULL,'xionan');
mysql> select * from student_info;
+--------+----------+
| stu_no | stu_name |
+--------+----------+
| 1 | xiaoc |
| 2 | xiaoz |
| 3 | xionan |
+--------+----------+
3 rows in set (0.00 sec) mysql> desc student_info;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| stu_no | int(11) | NO | PRI | NULL | auto_increment |
| stu_name | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
删除确发器,修改确发器:
触发器会随着表的删除被删除!
查看触发器:
show triggers; 正解版:
mysql> CREATE TABLE student_info (
->
-> stu_no INT(11) NOT NULL AUTO_INCREMENT,
->
-> stu_name VARCHAR(255) DEFAULT NULL,
->
-> PRIMARY KEY (stu_no)
->
-> );
Query OK, 0 rows affected (0.22 sec) mysql> CREATE TABLE student_count (
->
-> student_count INT(11) DEFAULT 0
->
-> );
Query OK, 0 rows affected (0.24 sec) mysql> INSERT INTO student_count VALUES(0);
Query OK, 1 row affected (0.14 sec) mysql> CREATE TRIGGER trigger_student_count_insert
->
-> AFTER INSERT
->
-> ON student_info FOR EACH ROW
->
-> UPDATE student_count SET student_count=student_count+1;
Query OK, 0 rows affected (0.09 sec) mysql> CREATE TRIGGER trigger_student_count_delete
->
-> AFTER DELETE
->
-> ON student_info FOR EACH ROW
->
-> UPDATE student_count SET student_count=student_count-1;
Query OK, 0 rows affected (0.14 sec) mysql> INSERT INTO student_info VALUES(NULL,'xiaoc'),(NULL,'xiaoz'),(NULL,'xionan');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student_info;
+--------+----------+
| stu_no | stu_name |
+--------+----------+
| 1 | xiaoc |
| 2 | xiaoz |
| 3 | xionan |
+--------+----------+
3 rows in set (0.00 sec) mysql> select * from student_count;
+---------------+
| student_count |
+---------------+
| 3 |
+---------------+
1 row in set (0.00 sec)
mysql> delete from student_info where stu_name in ('xionan','xiaoc');
Query OK, 2 rows affected (0.06 sec) mysql> select * from student_count;
+---------------+
| student_count |
+---------------+
| 1 |
+---------------+
1 row in set (0.00 sec)
mysql> insert into student_info values(null,'xiaol');
Query OK, 1 row affected (0.06 sec) mysql> select * from student_info;
+--------+----------+
| stu_no | stu_name |
+--------+----------+
| 2 | xiaoz |
| 4 | xiaol |
+--------+----------+
2 rows in set (0.00 sec) mysql> select * from student_count;
+---------------+
| student_count |
+---------------+
| 2 |
+---------------+
1 row in set (0.00 sec) 可以看到无论是INSERT还是DELETE学生,学生数目都会跟变化的。
创建包含多条执行语句的触发器:
在trigger_body中可以执行多条SQL语句,此时的trigger_body需要使用BEGIN和END做为开始和结束的标志:
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW BEGIN trigger_statement END; 示例2,创建包含多条执行语句的触发器:
(删除触发器)
mysql> show triggers\G;
*************************** 1. row ***************************
Trigger: trigger_student_count_insert
Event: INSERT
Table: student_info
Statement: UPDATE student_count SET student_count=student_count+1
Timing: AFTER
Created: NULL
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Definer: root@127.0.0.1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
Trigger: trigger_student_count_delete
Event: DELETE
Table: student_info
Statement: UPDATE student_count SET student_count=student_count-1
Timing: AFTER
Created: NULL
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Definer: root@127.0.0.1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
2 rows in set (0.00 sec) ERROR:
No query specified mysql> DROP TRIGGER trigger_student_count_insert;
Query OK, 0 rows affected (0.10 sec) mysql> DROP TRIGGER trigger_student_count_delete;
Query OK, 0 rows affected (0.00 sec)
mysql> show triggers;
Empty set (0.00 sec)
依然沿用上面的例子中的表,对student_count表做如下变更:增加student_class字段表示具体年级的学生数,其中0表示全年级,1代表1年级……;同样学生表中也增加该字段。清空两个表中的所有数据。
1:对student_count表增加student_class字段:
mysql> show create table student_count;
+---------------+-------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+-------------------------------------------------------------------------------------------------------------+
| student_count | CREATE TABLE `student_count` (
`student_count` int(11) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) mysql> alter table student_count add student_class int(11) default '0';
Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table student_count;
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| student_count | CREATE TABLE `student_count` (
`student_count` int(11) DEFAULT '0',
`student_class` int(11) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
<1> 删除上例中的两个触发器,初始化student_count表中数据,插入三条数据(0,0),(1,0),(2,0)表示全年级、一年级、二年级的初始人数都是0;
mysql> update student_count set student_count=0;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from student_count;
+---------------+---------------+
| student_count | student_class |
+---------------+---------------+
| 0 | 0 |
+---------------+---------------+
1 row in set (0.00 sec) mysql> insert student_count values(1,0),(2,0);
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from student_count;
+---------------+---------------+
| student_count | student_class |
+---------------+---------------+
| 0 | 0 |
| 1 | 0 |
| 2 | 0 |
+---------------+---------------+
3 rows in set (0.00 sec) <2> 创建触发器,在INSERT时首先增加学生总人数,然后判断新增的学生是几年级的,再增加对应年级的学生总数:
mysql> select * from student_info;
+--------+----------+
| stu_no | stu_name |
+--------+----------+
| 2 | xiaoz |
| 4 | xiaol |
+--------+----------+
2 rows in set (0.00 sec) mysql> delete from student_info where stu_name='xiaoz';
Query OK, 1 row affected (0.03 sec) mysql> delete from student_info where stu_name='xiaol';
Query OK, 1 row affected (0.06 sec) mysql> select * from student_info;
Empty set (0.00 sec)
上面是先清理一下数据: 字段的增加有误,顺序有误:
mysql> alter table student_count drop student_count;
Query OK, 0 rows affected (0.36 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student_count;
+---------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| student_class | int(11) | YES | | 0 | |
+---------------+---------+------+-----+---------+-------+
1 row in set (0.00 sec) mysql> alter table student_count add student_count int(11) default '0';
Query OK, 0 rows affected (0.41 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table student_count;
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| student_count | CREATE TABLE `student_count` (
`student_class` int(11) DEFAULT '0',
`student_count` int(11) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> delete from student_count where student_class=0;
Query OK, 3 rows affected (0.06 sec) 重新插入数据:
mysql> insert student_count values(0,0),(1,0),(2,0);
Query OK, 3 rows affected (0.08 sec)
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from student_count;
+---------------+---------------+
| student_class | student_count |
+---------------+---------------+
| 0 | 0 |
| 1 | 0 |
| 2 | 0 |
+---------------+---------------+
3 rows in set (0.00 sec)
http://blog.csdn.net/goskalrie/article/details/53020631
对student_count表做如下变更:增加student_class字段表示具体年级的学生数,其中0表示全年级,
1代表1年级……;同样学生表中也增加该字段。清空两个表中的所有数据。
mysql> alter table student_info add column student_class int//
Query OK, 0 rows affected (1.31 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student_info//
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| stu_no | int(11) | NO | PRI | NULL | auto_increment |
| stu_name | varchar(255) | YES | | NULL | |
| student_class | int(11) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec) 创建触发器,在INSERT时首先增加学生总人数,然后判断增加学生总人数,然后判断新增的学生几年级的,
再增加对应年级的学生总数。 mysql> delimiter $$
mysql> create trigger trigger_student_count_insert
-> after insert
-> on student_info for each row
-> begin
-> update student_count set student_count=student_count+1 where student_class=0;
-> update student_count set student_count=student_count+1 where student_class=new.student_class;
-> end
-> $$
Query OK, 0 rows affected (0.09 sec) mysql> delimiter;
创建触发器,在DELETE时首先减少学生总人数,然后判断删除的学生是几年级的,再减少对应年级的学生总数;
mysql> DELIMITER $$
mysql>
mysql> CREATE TRIGGER trigger_student_count_delete
->
-> AFTER DELETE
->
-> ON student_info FOR EACH ROW
->
-> BEGIN
->
-> UPDATE student_count SET student_count=student_count-1 WHERE student_class=0;
->
-> UPDATE student_count SET student_count=student_count-1 WHERE student_class= OLD.student_class;
->
-> END
->
-> $$
Query OK, 0 rows affected (0.15 sec) mysql>
mysql> DELIMITER ;
mysql> desc student_info//
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| stu_no | int(11) | NO | PRI | NULL | auto_increment |
| stu_name | varchar(255) | YES | | NULL | |
| student_class | int(11) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
向学生表中分别插入多条不同年级的学生信息,查看触发器是否起做用:
mysql> INSERT INTO student_info VALUES(NULL,'AAA',1),(NULL,'BBB',1),(NULL,'CCC',2),(NULL,'DDD',2),(NULL,'ABB',1),(NULL,'ACC',1);
Query OK, 6 rows affected (0.12 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from student_info;
+--------+----------+---------------+
| stu_no | stu_name | student_class |
+--------+----------+---------------+
| 1 | AAA | 1 |
| 2 | BBB | 1 |
| 3 | CCC | 2 |
| 4 | DDD | 2 |
| 5 | ABB | 1 |
| 6 | ACC | 1 |
+--------+----------+---------------+
6 rows in set (0.00 sec) mysql> select * from student_count;
+---------------+---------------+
| student_class | student_count |
+---------------+---------------+
| 1 | 4 |
| 2 | 2 |
| 0 | 6 |
+---------------+---------------+
3 rows in set (0.00 sec) 可以看到,总共插入6条数据,学生总数是6,1年级4个,2年级2个,trigger正确执行。
从学生表中分别岀除多条不同年级的学生信息,查看触发器是否起作用:
mysql> delete from student_info where stu_name like 'A%';
Query OK, 3 rows affected (0.15 sec) mysql> SELECT * FROM student_info;
+--------+----------+---------------+
| stu_no | stu_name | student_class |
+--------+----------+---------------+
| 2 | BBB | 1 |
| 3 | CCC | 2 |
| 4 | DDD | 2 |
+--------+----------+---------------+
3 rows in set (0.00 sec) mysql> select * from student_count;
+---------------+---------------+
| student_class | student_count |
+---------------+---------------+
| 1 | 1 |
| 2 | 2 |
| 0 | 3 |
+---------------+---------------+
3 rows in set (0.00 sec)
从学生表中将姓名以A开头的学生信息删除,学生信息删除的同时,数量表也跟随变化。
在上面的示例中,使用了三个新的关键字:DELIMITER、NEW、OLD,这三个关键字在官网上“触发器语法”一节中都有介绍
mysql trigger 触发器的更多相关文章
- mysql之触发器trigger 详解
为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) ...
- mysql之触发器入门
触发器语法: CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE | ...
- Mysql笔记——触发器简单实例
首先贴上触发器语法吧: CREATE TRIGGER <触发器名称> –触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFOR ...
- mysql的触发器
删除触发器 drop TRIGGER 触发器名字; 查找库里面的所有触发器 SELECT * FROM information_schema.`TRIGGERS`;show triggers 触发器语 ...
- Mysql 视图,触发器,存储过程,函数,事务
视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...
- MySql之触发器的使用
一:触发器的使用场景 当数据库的记录发生变化时,自动触发某些操作. MySQL的触发器响应三种操作,六种场合: 三种操作:DELETE.INSERT.UPDATE. 六种场合:三种操作的BEFORE. ...
- (mysql)触发器、事件、事务、函数
1.事务操作原理:事务开启之后Start transaction,所有的操作都会临时保存到事务日志.只有在得到commit才会关闭,否则清空:2.设置回滚点: savepoint 回滚点名字: 回到 ...
- MySQL数据库----触发器
触发器-trigger 触发器:监视某种情况,并触发某种操作. 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 -- 触发器:某种程序触发了工具的运行 -- 触发器不能主 ...
- MYSQL:基础——触发器
MYSQL基础——触发器 引入触发器 什么是触发器 如果你想要某条语句(或某些语句)在事件发生时自动执行.比如: 每当订购一个产品时,都从库存数量中减去订购的数量:无论何时删除一行,都在某个存档表中保 ...
随机推荐
- 安装lr时无法将值Disable Script Debugger 写入注册表
1. 运行“regedit”打开注册表编辑器. 2. 右键点击权限.HKEY_CURRENT_USER-Softwart-Microsoft-Internet Explorer-Main 3. 勾选e ...
- 跟我学Shiro---无状态 Web 应用集成
无状态 Web 应用集成 在一些环境中,可能需要把 Web 应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上相应的用户名进行登录.如一些 REST 风格的 ...
- 实现仿UC浏览器首页下拉动画
经常用UC看到首页有这么一个动画,就仿造写了一下. 实现分析 1.画曲线的动画 这个一眼看去就想到用贝塞尔曲线画,来看贝塞尔曲线方法,给出两个定点,和一个控制点就可以画. CGContextAddQu ...
- iOS 关于 GIF 图片那点事
前言 前几天我们项目组的群里提了这么一件事情:在我们的应用中存储动态的GIF图到相册,保存的图片变成了静态图片.而微博则能正确保存,可见这并不是一个技术不可实现的.前不久刚好看了苹果关于ImageIO ...
- zabbix v3.0安装部署
这篇文章没有写明init的部分要注意 zabbix v3.0安装部署 摘要: 本文的安装过程摘自http://www.ttlsa.com/以及http://b.lifec-inc.com ,和站长凉白 ...
- Java读写TXT文本
public String readTxtFile(String filePath) { StringBuffer appInfolistInput = new StringBuffer(); try ...
- 树莓派进阶之路 (031) -字符问题(1) - GBK汉字编码表(转)
转载:http://blog.sina.com.cn/s/blog_8184e033010109ug.html 基本简介 GB码,全称是GB2312-80<信息交换用汉字编码字符集基本集&g ...
- Magento模块升级修改数据库表结构
Magento支持在模块中创建.删除.更新数据库表及字段.通过该方式,在插件开发的过程中,添加和修改字段变成了一件非常轻松的事情.只需要修改模块的版本号,同时在文件中添加一个符合命名规则的脚本就可以了 ...
- magento 为用户注册增加一个字段(转)
步骤 I. 加一个occupation/title字段到用户注册页,差不多在register.html的54行,在email下方加一个Occupation显示代码 代码: <li>< ...
- jQuery Chosen 使用
jQuery Chosen 使用 1. jQuery Chosen 选择框下拉值重置: 1 2 3 4 //重置 $("#easySelBrands").val(" ...