mysql触发器总结
来源:互联网 发布:美工培训课程 编辑:程序博客网 时间:2024/06/04 17:56
触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该触发器。比如当相应的数据表被INSERT\DELETE或UPDATE语句修改时,触发器将自动执行。触发器可以被设置成在这几种语句处理每个数据行之前或之后触发。对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。
触发器优点:
语法格式:
CREATE TRIGGER trigger_name #触发器名称
{BEFORE | AFTER} #什么时候触发
{INSERT | UPDATE | DELETE} #触发的操作事件
ON table_name #触发相关联的表
FOR EACH ROW trigger_stmt; #当触发程序激活时执行的语句
创建添加触发器
NEW.col_name 表示插入数据的值,或修改后的值。
运行结果:
删除语法
DROP TRIGGER trigger_name
如
在触发程序的执行过程中,MySQL处理错误的方式如下:
触发器优点:
- 触发器可以检查或修改即将被插入或修改的数据,对输入数据进行必要的过滤,或强制检查数据是否合法,比如员工的年龄是不是大于18,而小于60岁,不在这个范围就不插入或修改。
- 当数据删除或修改时,触发器检查它当前的内容。比如某员工离职时,将删除相应的该员工记录,用触发器把相应的记录插入历史记录表。
- 触发器可以把表达式的结果赋值给数据列作为其默认值。
语法格式:
CREATE TRIGGER trigger_name #触发器名称
{BEFORE | AFTER} #什么时候触发
{INSERT | UPDATE | DELETE} #触发的操作事件
ON table_name #触发相关联的表
FOR EACH ROW trigger_stmt; #当触发程序激活时执行的语句
INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
举例:
创建表
CREATE TABLE `employee` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, `createTime` datetime NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建添加触发器
DELIMITER ;;CREATE TRIGGER `employee_tri`BEFORE INSERT #插入前触发ON `employee`FOR EACH ROWbegin #createTime为系统当前时间 set new.createTime=current_timestamp; if new.age<17 then #年龄小于17,将设为17 set new.age=17; elseif new.age>65 then #年龄大于65,将设为65 set new.age=65; end if;end;;DELIMITER ;
运行结果:
mysql> insert into employee(name,age,createTime) values('linchunda',13,'1990-06-12');Query OK, 1 row affected (0.03 sec)mysql> select * from employee;+----+-----------+-----+---------------------+| id | name | age | createTime |+----+-----------+-----+---------------------+| 1 | linchunda | 17 | 2013-08-01 21:32:14 |+----+-----------+-----+---------------------+1 row in set (0.00 sec)想插入年龄小于17的都不行,触发器自动置为17,创建时间自动为系统当前的时间
NEW.col_name 表示插入数据的值,或修改后的值。
OLD.col_name修改或删除它之前的值。
提示:如果是Ms SQL Server分别保存在inserted表、deleted表
创建删除触发器
删除一条记录后,将在history表添加一条相应的记录
#创建history表,该表结构和employee一样,但没有数据,因为没有id=-1的记录CREATE TABLE HISTORY SELECT * FROM employee where id=-1;DELIMITER ;;CREATE TRIGGER `employee_tri_del`BEFORE DELETE #删除前触发ON `employee`FOR EACH ROWbegin #把该条记录插入history表 INSERT INTO HISTORY SELECT * FROM employee where id=OLD.id;end;;DELIMITER ;
运行结果:
mysql> delete from employee where id =1;Query OK, 1 row affected (0.03 sec)mysql> select * from history;+----+-----------+-----+---------------------+| id | name | age | createTime |+----+-----------+-----+---------------------+| 1 | linchunda | 17 | 2013-08-01 21:32:14 |+----+-----------+-----+---------------------+1 row in set (0.00 sec)mysql> select * from employee;Empty set (0.00 sec)
删除语法
DROP TRIGGER trigger_name
如
DROP TRIGGER `employee_tri`;
在触发程序的执行过程中,MySQL处理错误的方式如下:
- 如果BEFORE触发程序失败,不执行相应行上的操作。
- 仅当BEFORE触发程序(如果有的话)和行操作均已成功执行,才执行AFTER触发程序。
- 如果在BEFORE或AFTER触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。
- 对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。
注:
mysql5.1.6版本之前,您必须要拥有SUPER权限,之后的版本因为触发器与一个数据表相关联,所以您必须拥有那个数据表的trigger权限才能为它创建和删除触发器。
- mysql触发器总结
- mysql触发器总结
- MySql触发器应用总结
- mysql触发器简单总结
- MySQL触发器基础总结
- Mysql Trigger触发器学习总结
- MySQL触发器总结以及XML初步学习
- MySQL数据库总结(9)触发器
- 【mysql 触发器】触发器使用
- MYSQL 触发器
- mysql 触发器
- Mysql 触发器
- mysql 触发器
- mysql触发器
- MYSQL 触发器
- MySQL触发器
- mysql 触发器
- mysql触发器
- .net文件系统--------序列化
- 重写Android Toast框
- PHP验证码类
- NUnit2.0详细使用方法
- 333333333333333333333333333333333333333333333333333333333333333
- mysql触发器总结
- 【算法导论】选择排序法
- UVA409- Excuses, Excuses!
- HDU 2036 多边形的面积
- 用django创建一个简单的sns
- 在使用apt-get安装报错:To continue type in the phrase 'Yes, do as I say!' ?] 解决方法
- Ubuntu 配置DNS
- NUnit中文说明文档
- TCP/Socket学习----ARP数据报格式