【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) 触发器的定义: 什么是触发器: 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据是触发执行,他比数据库本身标准的功能有更精细和更复杂的数据 ...
随机推荐
- ubuntu配置DNS
众所周知,centos配置DNS很简单,修改下/etc/resolv.conf,就可以生效.但是ubuntu中,resolv.conf文件却说明写入会被覆盖,不能写在这里. 方法一: 修改/etc/n ...
- 转 -android:程序无响应,你该如何定位问题?
如果MainThread长时间无响应,系统会提示“XXX无响应”,然后用户会关闭.那么,如何定位问题呢?无响应并不像Crash,它抓取不到异常日志,通常我们需要调试,才能定位问题.如何调试呢? 1.在 ...
- 图片_ _Android--加载大分辨率图片到内存
http://www.cnblogs.com/plokmju/p/android_LoadBigImage.html#3084005 前言 在使用ImageView显示图片的时候,直接加载一个图片资源 ...
- python 正则表达式 demo
1.匹配大小写和数字,并且大小写数字均要有,且字符串长度为6~20位 ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,20}$ import repattern ...
- [Flex] ButtonBar系列——控制ButtonBar菜单是否可用
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- eclipse快速收缩展开代码
快速折叠所有代码和展开所有代码都是CTRL+SHIFT+/
- DBCP数据库连接池
在用JDBC连接数据库的时候,需要创建对数据库的连接,这样才能执行后续的操作.然而,这样做有两个问题: 数据库允许的连接个数有限 创建连接的过程需要消耗内存和时间 所以,JDBC引入了连接池的概念.也 ...
- java异常处理机制Exception
Exception是一个整体的异常,子类NullPointerException.StringIndexOutOfBoundsException 异常处理语句 try{ 可能发生异常的代码片段 }ca ...
- easyui tabs内容panel自适应窗体宽度方法
废话不说,直接上代码: $('#Teacherwin_details').window({ title: '查看教职工信息', width: 800, height: 520, top: ($(win ...
- [kuangbin带你飞]专题十二 基础DP1
ID Origin Title 167 / 465 Problem A HDU 1024 Max Sum Plus Plus 234 / 372 Problem B HDU 1 ...