【MySQL】触发器学习
MySQL手册中对触发器的定义是:
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。表必须是永久性表,不能将触发程序与临时表与视图关联起来。
相同触发程序动作时间和事件的给定表,不能有两个触发程序。同一张表不能有两个before update(不同字段可写在一个trigger里面),但是可以同时有before update、after update或before insert。
语法:
DELIMITER $$ CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `db`.`tri_name` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `db`.`tb_name`
FOR EACH ROW BEGIN
#######
command
#######
END$$ DELIMITER ;
trgger_time:
before/after
trigger_event:
1.insert:insert、load data、replace可触发
2.update:
3.delete:delete、replace可触发
对于insert into ..on duplicate update语法要注意
使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD。col_name在更新或删除它之前,引用已有行中的列。NEW。col_name在更新它之后引用将要插入的新行或已有行的列。
使用OLD 和NEW关键字,能够访问受触发程序影响的行中的列(OLD 和NEW不区分大小写)。在INSERT 触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。
在UPDATE 触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
用OLD 命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE 权限,可使用“SET NEW. col_name =  value” 更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。
激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有select权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。
CREATE TRIGGER需要SUPER权限。
建表:
CREATE TABLE `test1`.`tri_test` (
`a` int(1) DEFAULT NULL,
`b` int(1) DEFAULT NULL
) CREATE TABLE `test2`.`tri_test` (
`a` int(1) DEFAULT NULL,
`b` int(1) DEFAULT NULL
)
示例:跨库两表insert数据同步触发器
DELIMITER $$ CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `test1`.`tri_test.insert.a` AFTER INSERT
ON `test1`.`tri_test`
FOR EACH ROW BEGIN
INSERT INTO test2.tri_test VALUES (new.a,new.b);
END$$ DELIMITER ;
示例:跨库两表update数据同步触发器
DELIMITER $$ CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `test1`.`tri_test.insert.a` AFTER INSERT
ON `test1`.`tri_test`
FOR EACH ROW BEGIN
IF new.b!=old.b
THEN
UPDATE test2.tri_test SET test2.tri_test.b=new.b
WHERE test2.tri_test.a=old.a ;
END IF;
END$$ DELIMITER ;
例:
delimiter //
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
delimiter ;
注意:
触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL (允许存储程序通过参数将数据返回触发程序)。
触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT 或ROLLBACK。
【MySQL】触发器学习的更多相关文章
- 一篇很棒的 MySQL 触发器学习教程
		一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动 ... 
- MySQL触发器学习总结
		1.What 触发器是MySQL响应DELETE,INSERT,UPDATE语句前后而自动执行的一条MySQL语句 2.Why(使用情形) 增加一个订单对应库存-1 删除一行在 ... 
- MYSQL触发器学习笔记
		课程学至金色晨曦科技公司技术总监沙利穆 触发器 1. 什么是触发器 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执 ... 
- MySQL触发器学习
		简介 MySQL从5.0.2版本开始支持触发器的功能.触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合. 创建触发器 语法: CREATE TRIGGER trigge ... 
- MySQL 触发器学习-markdown->html 格式测试
		<!doctype html>触发器 figure:first-child { margin-top: -20px; } #write ol, #write ul { position: ... 
- mysql 触发器学习(可以将mysql数据同步到redis)
		1. 一个简单的例子 1.1. 创建表: create table t(s1 integer); 1.2. 触发器: delimiter | create trigger t_trigger befo ... 
- mysql 触发器学习
		1. 一个简单的例子 1.1. 创建表: create table t(s1 integer); 1.2. 触发器: delimiter | create trigger t_trigger befo ... 
- mysql触发器 学习
		1. 说明: 触发器的定义就是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好 ... 
- 关于mysql触发器和存储过程的理解
		内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ... 
- MYSQL进阶学习笔记七:MySQL触发器的创建,应用及管理!(视频序号:进阶_16,17)
		知识点八:MySQL触发器的应用(16,17) 触发器的定义: 什么是触发器: 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据是触发执行,他比数据库本身标准的功能有更精细和更复杂的数据 ... 
随机推荐
- Scala第一章学习笔记
			面向对象编程是一种自顶向下的程序设计方法.用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this).行为(方法).和状态(成员变量).识别出名词并且定 ... 
- Spark作业调度
			Spark在任务提交时,主要存在于Driver和Executor的两个节点. (1)Driver的作用: 用于将所有要处理的RDD的操作转化为DAG,并且根据RDD DAG将JBO分割为多个Stage ... 
- eclipse--解决Android模拟器端口被占用问题的办法
			一.问题描述 今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured& ... 
- Beautiful Soup第三方爬虫插件
			什么是BeautifulSoup? Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的 ... 
- 01- 使用brew 安装ant -学习笔记(一)
			1.卸载Mac OS下brew工具:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mast ... 
- python datetime时区转换
			from pytz import timezone def datetime_as_timezone(date_time, time_zone): tz = timezone(time_zone) u ... 
- (medium)LeetCode  238.Product of Array Except Self
			Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ... 
- [POJ 2063] Investment (动态规划)
			题目链接:http://poj.org/problem?id=2063 题意:银行每年提供d种债券,每种债券需要付出p[i]块钱,然后一年的收入是v[i],到期后我们把本金+收入取出来作为下一年度本金 ... 
- 50. Pow(x, n) (编程技巧)
			Implement pow(x, n). double sum = 1; if (n > 0) { while ((n--) > 0) sum *= x; return sum; } el ... 
- [C# 基础知识系列]C#中易混淆的知识点
			一.引言 今天在论坛中看到一位朋友提出这样的一个问题,问题大致(问题的链接为:http://social.msdn.microsoft.com/Forums/zh-CN/52e6c11f-ad28-4 ... 
