MySQL触发器学习
简介
MySQL从5.0.2版本开始支持触发器的功能。触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
创建触发器
语法:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tb_name FOR EACH ROW trigger_stmt
根据语法来演示如何创建一个触发器,首先创建2张表:student 和 student_demo
-- CREATE TABLE student CREATE TABLE `student` ( `id` ) unsigned NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `age` ) NOT NULL, `gender` enum('女','男') NOT NULL, `address` ) NOT NULL, PRIMARY KEY (`id`) ) ENGINE DEFAULT CHARSET=utf8; -- CREATE TABLE student_demo CREATE TABLE `student_demo` ( `id` ) NOT NULL, `name` ) NOT NULL, `address` ) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
现在假设在表student新增一条记录后,student_demo也需新增一条记录,根据此需求来演示触发器的创建
-- CREATE TRIGGER ins_student CREATE TRIGGER ins_student AFTER INSERT ON student FOR EACH ROW BEGIN INSERT INTO student_demo (id, name, address) VALUES ( new.id, new.name, new.address ); END;
现在为student表创建了AFTER INSERT的触发器,在向student表插入数据时,student_demo也会插入相应的记录
可以看到,在向student表中新增一个名为"韩梅梅"的学生信息时,student_demo也新增了其对应信息
对于INSERT INTO...ON DUPLICATE KEY UPDATE语句,触发触发器的顺序有所不同。对student表分别创建BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE,插入记录观察结果。
-- 创建表tri_test ), PRIMARY KEY (id)) -- 创建before insert触发器 CREATE TRIGGER ins_student_bef BEFORE INSERT ON student FOR EACH ROW BEGIN INSERT INTO tri_test (note) VALUES ('before insert'); END; -- 创建after insert触发器 CREATE TRIGGER ins_student_aft AFTER INSERT ON student FOR EACH ROW BEGIN INSERT INTO tri_test (note) VALUES ('after insert'); END; -- 创建before update触发器 CREATE TRIGGER upd_student_bef BEFORE UPDATE ON student FOR EACH ROW BEGIN INSERT INTO tri_test (note) VALUES ('before update'); END; -- 创建after update触发器 CREATE TRIGGER upd_student_aft AFTER UPDATE ON student FOR EACH ROW BEGIN INSERT INTO tri_test (note) VALUES ('after update'); END;
现在student表中已有一条记录
现在对id=3的记录,插入数据
INSERT INTO student VALUES ( , '李雷', , '男', '河北石家庄' ) ON DUPLICATE KEY UPDATE NAME = 'update record'
表student和tri_test中的数据为:
对于有重复记录、需要进行UPDATE的INSERT操作,触发器出发的顺序是BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE
如果是插入新的不重复的数据
INSERT INTO student VALUES ( , '大卫', , '男', '河北保定' ) ON DUPLICATE KEY UPDATE NAME = 'update record'
则表数据为
触发器的顺序为BEFORE INSERT、AFTER INSERT
删除触发器
一次可删除一个触发器,如果没有指定则默认为当前数据库。语法如下:
DROP TRIGGER [schema_name.]trigger_name
例如,要删除触发器ins_student,可以执行
查看触发器
SHOW TRIGGERS
可以通过SHOW TRIGGERS命令来查看触发器的状态、语法等信息,此命令查询的是所有触发器的信息
查询系统表
通过查询系统表中的information_schema.triggers表,可以查询指定触发器的信息
查询指定触发器"ins_student"的信息
MySQL触发器学习的更多相关文章
- 一篇很棒的 MySQL 触发器学习教程
一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动 ...
- MySQL触发器学习总结
1.What 触发器是MySQL响应DELETE,INSERT,UPDATE语句前后而自动执行的一条MySQL语句 2.Why(使用情形) 增加一个订单对应库存-1 删除一行在 ...
- MYSQL触发器学习笔记
课程学至金色晨曦科技公司技术总监沙利穆 触发器 1. 什么是触发器 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执 ...
- 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) 触发器的定义: 什么是触发器: 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据是触发执行,他比数据库本身标准的功能有更精细和更复杂的数据 ...
随机推荐
- [故障公告]14:40-15:00博客站点web服务器雪崩似的CPU 100%
非常抱歉,今天下午14:40-15:00左右,web服务器突然雪崩似的出现CPU 100%问题,造成博客站点无法访问(503).由此给您带来很大的麻烦,请您谅解. 在问题出现之前,博客站点运行着5台w ...
- Makefile学习总结
Makefile用法分析 在linux开发中,应用程序的编译基本都采用GNU的make工具,而make搭配Makefile来实现工程代码的编译,在越是大型复杂的项目中,make的强悍之处越是明 ...
- Servlet Filter 中init和destroy问题
测试源码如下: package com.FilterTest.Filter; import java.io.IOException; import javax.servlet.Filter; impo ...
- Spring3中@Value注解的使用
Spring可以通过@Value注解来直接获取properties文件里面配置的值. 1. 首先要在spring的配置文件中指明properties文件的位置: <context:propert ...
- Python中的元类(metaclass)
推荐+收藏:深刻理解Python中的元类(metaclass) 做一些笔记学习学习: 在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有 ...
- 解决IE8下不支持document.getElementsByClassName的方法
在代码前面加如下代码: if (!document.getElementsByClassName) { document.getElementsByClassName = function (clas ...
- git创建版本库以及使用
Git使用教程(摘自tugenhua0707) 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央 ...
- 浅谈Nginx负载均衡原理与实现
1.Nginx能做什么? Nginx可以两件事: -- HTTP请求 经过官方测试Nginx可以承受5万的并发量.可用来做静态资源的图片服务器 --负载均衡,如下解释什么是负载均衡. 2.负载均衡 ...
- RxSwift 系列(六) -- Mathematical and Aggregate Operators
前言 本篇文章将要学习RxSwift中数学和集合操作符,在RxSwift中包括了: toArray reduce concat toArray 将一个Observable序列转化为一个数组,并转换为一 ...
- 2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能
2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能,否则极有可能被拒! 在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到20 ...