MySQL触发器的使用场景及方法实例

触发器:

触发器的使用场景以及相应版本:

触发器可以使用的MySQL版本:

  • 版本:MySQL5以上

使用场景例子:

  1. 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写
  2. 每当订购一个产品时,都从库存数量中减去订购的数量
  3. 无论何时删除一行,都在某个存档表中保留一个副本

即:在某个表发生更改时自动处理。

如遇到触发器报错“Not allowed to return a result set from a trigger”;请划到最后看详解;

触发器的使用:

创建基本的触发器:

CREATE TRIGGER newproduct AFTER INSERT on products FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 SET msg = "products added";
 SIGNAL SQLSTATE 'HY000' SET message_text = msg;

END

结果:

INSERT INTO products VALUES('demo2','1003','xiaoguo','66.6','hello world')
> 1644 - products added
> 时间: 0.035s

解释:

首先创建一个触发器:

#newproduct 触发器的名字
CREATE TRIGGER newproduct

触发的时机:

BEFORE:触发器在触发他们的语句之前触发

AFTER:触发器在触发他们的语句完成后触发

在这里我们使用的after;也就是在插入结束后触发条件;

DECLARE msg VARCHAR(100);

注意:declare语句是在复合语句中声明变量的指令;如果不声明msg,执行语句时,MySQL报错;

SIGNAL SQLSTATE 'HY000' SET message_text = msg;

如果该SIGNAL语句指示特定SQLSTATE值,则该值用于表示指定的条件

"HY000”被称为“一般错误":

如果命令出现一般错误,则会触发后面的message中的消息;

注:该语句只是个人理解,也是一知半解,如果有更好的解释,欢迎留言。

触发的条件以BEGIN开始,END结束。

触发事件:

  1. insert
  2. update
  3. delete

删除触发器:

-- 删除触发器
DROP TRIGGER newproduct;

INSERT触发器:

insert触发器在insert语句执行之前或者之后执行,需要注意以下几点:

  1. 在insert触发器代码内。可以引用一个名为NEW的虚拟表,访问被插入的行;
  2. 在before insert触发器中,NEW中的值也可以被更新(允许更改被插入的值)
  3. 对于AUTO_INCREMENT列,NEW在insert执行之前包含0,在insert执行之后包含新的自动生成值

例子:插入一个新的订单时,生成一个新的订单号保存到order_num

CREATE TRIGGER neworder AFTER INSERT ON orders for EACH ROW
 SELECT NEW.order_num into @ee;

insert INTO orders(order_date,cust_id) VALUES(NOW(),10001);
SELECT @ee as num;

drop TRIGGER neworder;

解释:

创建一个neworder的触发器,在插入之后执行,且对每个插入行执行,在insert中有一个与orders表一摸一样的虚表,用NEW 表示;

SELECT NEW.order_num into @a;

在虚表中找到我们插入的数据的编号,将标号保存在a变量中;

检测:

insert INTO orders(order_date,cust_id) VALUES(NOW(),10001);
SELECT @ee as num;

插入数据,输出插入数据的编号

删除:

drop TRIGGER neworder;

删除触发器。

例二:

在COURSE表上创建触发器,检查插入时是否出现课程名相同的记录,若有则不操作。

CREATE TRIGGER trg_course_in
BEFORE INSERT ON course
FOR EACH ROW
BEGIN
  DECLARE msg VARCHAR(100);
  IF EXISTS (SELECT * FROM course where cname=NEW.cname) THEN
   SET msg='不能输入相同名称的课程';
   SIGNAL SQLSTATE 'HY000' SET message_text = msg;
  END IF; 

END

例三:向student表中插入信息时,检查ssex的值必须为男或女。

CREATE TRIGGER trg_ssex AFTER INSERT on student FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 IF(NEW.ssex not in('男','女')) THEN
 SET msg ='性别必须为男或女';
 SIGNAL SQLSTATE 'HY000' SET message_text = msg;
 END IF
END

UPDATE触发器:

  1. 在update触发器的代码中,可以引用一个名为OLD的虚拟表访问以前的值,即:update未执行前的值,还可以引用一个名为NEW的虚拟表访问新更新的值;
  2. 在before update触发器中,NEW中的值可能也被更新(允许修改将要用于update语句中的值);
  3. OLD中的值全部只读,不能更新。

例一:保证州名缩写为大写

CREATE TRIGGER UPDATEevendor BEFORE UPDATE on vendors
FOR EACH ROW SET new.vend_state =UPPER(new.vend_state);

UPDATE vendors SET vend_state='hw' where vend_id='1001';
DROP TRIGGER UPDATEevendor;

注:upper:将文本转换为大写:

例二:不允许修改student表中的学号sno,如果修改该列则显示错误信息并取消操作。

CREATE TRIGGER trg_student_updateSno BEFORE UPDATE
FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 IF NEW.sno <> OLD.sno THEN
 SET msg='不允许修改sno';
 SIGNAL SQLSTATE 'HY000' SET message_text = msg;
 END IF;
END

DELETE触发器:

在DELETE触发器在delete语句执行之前或之后执行:

  1. 在delete触发器代码内,可以引用OLD的虚拟表,访问被删除的行;
  2. OLD中的值全部都是只读,不能更新

例子:

使用old保存将要被删除的行到一个存档表中

首先先创建一个与orders相似的表:

CREATE TABLE archive_orders LIKE orders;
-- 创建一个删除的触发器
CREATE TRIGGER deleteorder BEFORE DELETE on orders
for EACH ROW BEGIN
INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(old.order_num,old.order_date,old.cust_id);
END

解释:

在删除order表中行中信息时,将删除的信息保存到archive_orders中;

删除原表中一行:

DELETE FROM orders WHERE order_num='20014';

查看效果:

SELECT * FROM archive_orders;

结束:

注:如果遇到触发器报错“Not allowed to return a result set from a trigger”

  1. 原因:因为从MySQL5以后不支持触发器返回结果集
  2. 解决方法:在后面语句后面添加 into @变量名
  3. 取数据:select @变量名

详细解释:https://www.programmersought.com/article/3237975256/

创建用户变量:https://www.jb51.net/article/201843.htm

到此这篇关于MySQL触发器的使用场景及方法的文章就介绍到这了,更多相关MySQL触发器使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL 在触发器里中断记录的插入或更新?

    下面是一种实现的方法.思路就是想办法在触发器中利用一个出错的语句来中断代码的执行. mysql> create table t_control(id int primary key); Query OK, 0 rows affected (0.11 sec) mysql> insert into t_control values (1); Query OK, 1 row affected (0.05 sec) mysql> create table t_bluerosehero(id i

  • MySQL笔记之触发器的应用

    创建触发器 创建只有一个执行语句的触发器 复制代码 代码如下: CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件ON 表名 FOR EACH ROW 执行语句 其中,触发器名参数指要创建的触发器的名字 BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后 FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器 复制代码 代码如下: mysql> CREATE TRIGGER trig1 AFTER INSERT    -> ON

  • mysql 触发器实现两个表的数据同步

    mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

  • MySQL触发器概念、原理与用法详解

    本文实例讲述了MySQL触发器概念.原理与用法.分享给大家供大家参考,具体如下: 1.触发器的概念 触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行.--百度百科 上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的s

  • Mysql中的触发器简单介绍及使用案例

    什么是触发器? 触发器是数据库的一个程序,他是用来监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句 触发器的语法结构: create trigger 触发器的名称触发器事件 on 监听的表名 for each row 行为发生后执行的sql语句 触发器事件组成::两部分组成: 触发器事件发生的时间-----是在监听的表的行为 after before 常用的是after 触发器执行的内容:增删改 创建order 表的时候,需要注意,因为order在mysql中是一个关

  • mysql触发器(Trigger)简明总结和使用实例

    一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行.触发器经常用于加强数据的完整性约束和业务规则等. 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数

  • 如何测试mysql触发器和存储过程

    1. 为了测试触发器和存储过程,首先建立一张简单的表: 复制代码 代码如下: CREATE TABLE `airuser` ( `userId` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(128) NOT NULL, PRIMARY KEY (`userId`) )ENGINE=InnoDB DEFAULT CHARSET=utf8 2. 为该表的插入操作,创建一张记录表: 复制代码 代码如下: CREATE TABLE `airus

  • MYSQL设置触发器权限问题的解决方法

    本文实例讲述了MYSQL设置触发器权限的方法,针对权限错误的情况非常实用.具体分析如下: mysql导入数据提示没有SUPER Privilege权限处理,如下所示: ERROR 1419 (HY000): You do not have the SUPER Privilege and Binary Logging is Enabled 导入function . trigger 到 MySQL database,报错: You do not have the SUPER privilege an

  • MySQL如何创建触发器

    本文实例为大家分享了MySQL创建触发器的具体代码,供大家参考,具体内容如下 先来个实例: #建表 DROP TABLE IF EXISTS t_attendance; CREATE TABLE t_attendance ( job_no VARCHAR(30) DEFAULT '', operateTime VARCHAR(20) DEFAULT '', INDEX index_operateTime(operateTime), INDEX index_jobNo(job_no) ) ENGI

  • MySQL触发器使用详解

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下: 复制代码 代码如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中: trigger_name:标识触发器名称,用户自行指定: trigger_tim

随机推荐