触发器

在实际开发中,我们经常会遇到这样的情况:有两个或者多个相互关联的表,如商品信息和库存信息分别存放在2个不同的数据表中,我们在添加一条新的商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。
这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用事务包裹起来,确保这两个操作成为一个原子操作,要么全部执行,要么全部不执行。要是遇到特殊情况,可能还需要对数据进行手动维护,这样就很容易忘记其中的一步,导致数据缺失。
这个时候,咱们可以使用触发器。你可以创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作。这样一来,就不用担心因为忘记添加库存数据而导致的数据缺失了。

一.触发器的概述

MySQL从5.0.2版本开始支持触发器。MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一段程序。
触发器是由事件来触发某个操作,这些事件包括INSERT,UPDATE,DELETE事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句的时候,就相当于事件发生了,就会自动激发触发器执行相应操作。
当对数据表中的数据执行插入,更新和删除,需要自动执行一些数据库逻辑时,可以是由触发器来实现。

二.触发器的创建

1.创建触发器语法
创建触发器的语法结构是:

create trigger 触发器名称{ before | after } { insert | update | delete } on 表名for each row触发器执行的语句块;

说明:
- 表名:表示触发器监控的对象。
- before | after:表示触发的时间。before表示在事件之前触发,after表示在事件之后触发。
- insert | update |delete :表示触发的事件。
- insert 表示插入记录时触发;
- update表示更新记录时触发;
- delete表示删除记录时触发。
- 触发器执行的语句块:可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块。

2.代码举例

举例1:
(1).创建数据表:

create table test_trigger(
id int primary key auto_increment,
t_note varchar(30)
);create table test_trigger_log(
id int primary key auto_increment,
t_log varchar(30)
);#@查看表数据:
select * from test_trigger;
select * from test_trigger_log;

技巧:DELIMITER是修改结束符号,防止读取到begin后面的sql语句之后就停止了

(2).创建触发器:创建名称为before_insert_test_tri的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before insert的日志信息。

DELIMITER  //create trigger before_insert_test_tri
before insert on test_trigger
for each row
begininsert into test_trigger_log(t_log)values('before insert...');
end   //DELIMITER ;#@测试
insert into test_trigger(t_note)
values('TOM...');select * from test_trigger;
select * from test_trigger_log;

举例2:
(1).创建名称为after_insert_test_tri的触发器,向test_trigger数据表中插入数据之后,向test_trigger_log数据表中插入after_insert的日志信息。

DELIMITER $create trigger after_insert_test_tri
after insert on test_trigger
for each row
begininsert into test_trigger_log(t_log)values('after_insert');
end $DELIMITER ;#@查看表数据:
select * from test_trigger;
select * from test_trigger_log;

(2).向test_trigger数据表中插入数据。

insert into test_trigger(t_note) values ('Jerry...');#@查看表数据:
select * from test_trigger;
select * from test_trigger_log;

举例3:
定义触发器“salary_check_trigger",基于员工表"employees"的INSERT事件,
在INSERT之前检查将要添加的新员工薪资是否大于他领导的薪资,如果大于领导薪资,
则报sqlstate_value为’HY000‘的错误,从而使得添加失败。

(1).准备工作

create table employees
as
select * from atguigudb.'employees';create table departments
as
select * from atguigubd.'departments';desc employees;

(2).创建触发器

DELIMITER //create trigger salary_check_trigger
before insert on employees
for each row
begin#查询到要添加的数据的manager的薪资declare mgr_sal double;select salary into mgr_sal from employees where employee_id = new.manager_id;if new.salary > mgr_salthen signal sqlstate 'HY000' set message_text = '薪资高于领导薪资错误';
end  //DELIMITER ;#@测试
desc employees;
#@添加成功:依然触发了触发器salary_check_trigger的执行
insert into employees(employee_id,last_name,email,hire_date,job_id,salary,manager_id)
values(300,'Tom','tom@126.com',CURDATE(),'AD_VO',8000,103);
#@添加失败
insert into employees(employee_id,last_name,email,hire_date,job_id,salary,manager_id)
values(301,'Tom1','tom@126.com',CURDATE(),'AD_VO',10000,103);select * from employees;

上面触发器声明过程中的new关键字代表insert添加语句的新记录。

二.查看、删除触发器

1.查看触发器
查看触发器是查看数据库中已经存在的触发器的定义、状态和语法信息等。
方式1:查看当前数据库的所有的触发器的定义

show trigger\G

方式2:查看当前数据库中某个触发器的定义

show create trigger 触发器名

方式3:从系统库information_schema的triggers表中查询"salary_check_trigger"触发器的信息。

select * from information_schema.triggers;

2.删除触发器
触发器也是数据库对象,删除触发器也用drop语句,语法格式如下:

drop trigger if exists 触发器名称;

三.触发器的优缺点

1.优点
(1).触发器可以确保数据的完整性。
(2).触发器可以帮助我们记录操作日志。
(3).触发器还可以用在操作数据前,对数据进行合法性检查。

2.缺点
(1).触发器最大的一个问题就是可读性差。
(2).相关数据的变更,可能会导致触发器出错。

数据库mysql进阶—trigger触发器相关推荐

  1. Mysql使用trigger触发器说明

    由于项目中需要使用到触发器个人就开始简单的了解了一下.但是过程中遇到了几个问题,在此记录一下. 前三步先把效果展示出来,后面会对trigger做详细的描述 第一步:创建测试表 CREATE TABLE ...

  2. 数据库MySQL/mariadb知识点——触发器

    触发器 触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增.删.改)的时候,系统会自动触发代码并执行. 触发器包含三个要素,分别为 事件类型:增删改,即insert.d ...

  3. MySQL进阶:触发器

    -- 触发器(trigger) /*触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触 发并执行触发器中定义的SQL语句集合.触发器 ...

  4. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

    超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...

  5. 【MySQL | 进阶篇】05、MySQL 视图、触发器讲解

    目录 一.视图 1.1 介绍 1.2 语法 1.2.1 演示示例 1.3 检查选项 1.3.1 CASCADED 级联 1.3.2 LOCAL 本地 1.3.3 示例演示 1.4 视图的更新 1.4. ...

  6. MySQL存储过程和触发器的实现--数据库学习笔记

    从MySQL5.0版本开始就对存储过程和触发器进行了支持,在MySQL进行学习前,先查看您所使用的版本吧,方法有: 1.$mysql -V  //linux终端下 2.select version() ...

  7. mysql利用触发器删除数据库_[数据库]mysql 触发器的创建 修改 删除

    [数据库]mysql 触发器的创建 修改 删除 0 2015-12-16 23:00:04 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 '日记本的回忆' ...

  8. mysql 触发器_进阶msql触发器-指南

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update ...

  9. 数据库工作笔记012---mysql触发器trigger 实例详解_保证数据库完整性还是不错的

    mysql的触发器,可以挺好的保证数据库的数据的完整性,这个还是不错的 JAVA技术交流QQ群:170933152 比如: 我一个表中的数据有变化,那么与之关联的几个表可以通过触发器来实现同步 --- ...

最新文章

  1. RNA和机器学习:多维生物标志物的合理设计
  2. VB.NET 快速向Excel写入大量数据
  3. 免费申请Firefly-RK3288开源板
  4. 8086汇编4位bcd码_51单片机用汇编语言实现BCD码转换
  5. 光谱分类算法 matlab,Matlab K-means聚类算法对多光谱遥感图像进行分类(一)
  6. 相机标定:PNP基于单应面解决多点透视问题
  7. vfp 连接mysql数据库_Visual FoxPro操作数据库之函数大全
  8. c++ assert() 使用方法
  9. sort()与cmp()
  10. Axios中无法运行 json-server【已解决】
  11. PyTorch:损失函数loss function
  12. 全球及中国熔融碳酸盐燃料电池行业市场消费量调研及未来前瞻报告2022-2028年
  13. js国际区号json
  14. 单片机C51之1:流水灯
  15. 移动端网页字体过多时,字体被自动放大问题
  16. 朱啸虎建议创业者忘记区块链,遭应书岭回讽:你老了
  17. 华硕服务器主板引导设置,装系统时的引导设置_华硕 ROG Rampage VI Apex_主板评测-中关村在线...
  18. Hyperledger Fabric 网络环境的一点理解
  19. 戴尔Inspiron 灵越 15 5000(5580)BIOS设置U盘启动
  20. 畜牧业的产业升级技术

热门文章

  1. 富怡CAD计算机在哪,富怡CAD软件如何与富怡数字化仪进行连接
  2. Visa领导女性赋权新的十年
  3. 计算机与化学参考文献,实验学生论文,关于计算机对化学实验课的辅助作用相关参考文献资料-免费论文范文...
  4. 系统架构与5G异构云无线入网关键技术(物联网电子类外文翻译)
  5. [perl] Perl切片
  6. 你以为越复杂的密码越安全?小心那些错误认知
  7. 你的压力狗狗懂,通过闻味就知道!英国学者做实验论证,专门收集人做数学题时的气味...
  8. PowerPC简介及编程
  9. 用计算机谈歌曲凉凉,快速让你学会唱《凉凉》这首歌,千万不要错过哦!
  10. 软件测试到底是做什么的?职责是什么?