当前位置:首页 > 实用技巧 >

哪条语句触发了触发器(怎么判定触发器的触发时刻)

来源:原点资讯(www.yd166.com)时间:2024-02-11 06:38:05作者:YD166手机阅读>>

MySQL触发器什么是触发器

触发器(TRIGGER)是 Mysql 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。简单理解为:你执行一条 sql 语句,这条 sql 语句的执行会自动去触发执行其他的 sql 语句。

触发器的作用
  1. 可在写入数据表前,强制检验或转换数据。
  2. 触发器发生错误时,异动的结果会被撤销。
  3. 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为 DDL 触发器。
  4. 可依照特定的情况,替换异动的指令 (INSTEAD OF)。
触发器创建的四要素
  1. 监视地点(table)
  2. 监视事件(insert、update、delete)
  3. 触发时间(after、before)
  4. 触发事件(insert、update、delete)
触发器的使用语法语法

CREATE TRIGGER 触发器名 BEFORE|AFTER DELETE|INSERT|UPDATE ON 表名 FOR EACH ROW BEGIN 触发SQL代码块; END;参数

参数

描述

before/after

触发器是在增删改之前执行,还是之后执行

delete/insert/update

触发器由哪些行为触发(增、删、改)

on 表名

触发器监视哪张表的(增、删、改)操作

触发SQL代码块

执行触发器包含的 SQL 语句

说明

触发器也是存储过程程序的一种,而触发器内部的执行 SQL 语句是可以多行操作的,所以在 MySQL 的存储过程程序中,要定义结束符。

查看触发器语法

SHOW TRIGGERS\G;

结果,显示所有触发器的基本信息;无法查询指定的触发器。在 information_schema.triggers 表中查看触发器信息:

mysql> SELECT * FROM information_schema.triggers\G

比如:

mysql> select * from information_schema.triggers where trigger_name='upd_check'\G;

所有触发器信息都存储在 information_schema 数据库下的 triggers 表中,可以使用 SELECT 语句查询,如果触发器信息过多,最好通过 TRIGGER_NAME 字段指定查询。

删除触发器语法

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

删除触发器之后最好使用上面的方法查看一遍;同时,也可以使用 database.trig 来指定某个数据库中的触发器。如果不需要某个触发器时一定要将这个触发器删除,以免造成意外操作,这很关键。

案例创建BEFORE类型触发器

在 test_db 数据库中,数据表 tb_emp8 为员工信息表,包含 id、name、deptId 和 salary 字段,数据表 tb_emp8 的表结构如下所示:

mysql> SELECT * FROM tb_emp8; Empty set (0.07 sec) mysql> DESC tb_emp8; -------- ------------- ------ ----- --------- ------- | Field | Type | Null | Key | Default | Extra | -------- ------------- ------ ----- --------- ------- | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | YES | UNI | NULL | | | deptId | int(11) | NO | MUL | NULL | | | salary | float | YES | | 0 | | -------- ------------- ------ ----- --------- ------- 4 rows in set (0.05 sec)

创建一个名为 SumOfSalary 的触发器,触发的条件是向数据表 tb_emp8 中插入数据之前,对新插入的 salary 字段值进行求和计算。输入的 SQL 语句和执行过程如下所示:

mysql> CREATE TRIGGER SumOfSalary -> BEFORE INSERT ON tb_emp8 -> FOR EACH ROW -> SET @sum=@sum NEW.salary; Query OK, 0 rows affected (0.35 sec)

触发器 SumOfSalary 创建完成之后,向表 tb_emp8 中插入记录时,定义的 sum 值由 0 变成了 1500,即插入值 1000 和 500 的和,如下所示:

SET @sum=0; Query OK, 0 rows affected (0.05 sec) mysql> INSERT INTO tb_emp8 -> VALUES(1,'A',1,1000),(2,'B',1,500); Query OK, 2 rows affected (0.09 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT @sum; ------ | @sum | ------ | 1500 | ------ 1 row in set (0.03 sec)创建AFTER类型触发器

在 test_db 数据库中,数据表 tb_emp6 和 tb_emp7 都为员工信息表,包含 id、name、deptId 和 salary 字段,数据表 tb_emp6 和 tb_emp7 的表结构如下所示:

mysql> SELECT * FROM tb_emp6; Empty set (0.07 sec) mysql> SELECT * FROM tb_emp7; Empty set (0.03 sec) mysql> DESC tb_emp6; -------- ------------- ------ ----- --------- ------- | Field | Type | Null | Key | Default | Extra | -------- ------------- ------ ----- --------- ------- | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | MUL | NULL | | | salary | float | YES | | NULL | | -------- ------------- ------ ----- --------- ------- 4 rows in set (0.00 sec) mysql> DESC tb_emp7; -------- ------------- ------ ----- --------- ------- | Field | Type | Null | Key | Default | Extra | -------- ------------- ------ ----- --------- ------- | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | 0 | | -------- ------------- ------ ----- --------- ------- 4 rows in set (0.04 sec)

创建一个名为 double_salary 的触发器,触发的条件是向数据表 tb_emp6 中插入数据之后,再向数据表 tb_emp7 中插入相同的数据,并且 salary 为 tb_emp6 中新插入的 salary 字段值的 2 倍。输入的 SQL 语句和执行过程如下所示:

mysql> CREATE TRIGGER double_salary -> AFTER INSERT ON tb_emp6 -> FOR EACH ROW -> INSERT INTO tb_emp7 -> VALUES (NEW.id,NEW.name,deptId,2*NEW.salary); Query OK, 0 rows affected (0.25 sec)

触发器 double_salary 创建完成之后,向表 tb_emp6 中插入记录时,同时向表 tb_emp7 中插入相同的记录,并且 salary 字段为 tb_emp6 中 salary 字段值的 2 倍,如下所示:

mysql> INSERT INTO tb_emp6 -> VALUES (1,'A',1,1000),(2,'B',1,500); Query OK, 2 rows affected (0.09 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb_emp6; ---- ------ -------- -------- | id | name | deptId | salary | ---- ------ -------- -------- | 1 | A | 1 | 1000 | | 2 | B | 1 | 500 | ---- ------ -------- -------- 3 rows in set (0.04 sec) mysql> SELECT * FROM tb_emp7; ---- ------ -------- -------- | id | name | deptId | salary | ---- ------ -------- -------- | 1 | A | 1 | 2000 | | 2 | B | 1 | 1000 | ---- ------ -------- -------- 2 rows in set (0.06 sec)



,

栏目热文

创建触发器的sql语句是什么(sql触发器三个表怎么用)

创建触发器的sql语句是什么(sql触发器三个表怎么用)

本教程为大家介绍SQL Server触发器创建、删除、修改、查看方法。一、触发器是一种特殊的存储过程,它不能被显式地调...

2024-02-11 06:40:39查看全文 >>

怎么定义和使用触发器(触发器怎么设置条件)

怎么定义和使用触发器(触发器怎么设置条件)

一、触发器的定义触发器是一种特殊类型的存储过程,在数据库服务器中发生事件时自动运行。 触发器是为了响应各种DML、DDL...

2024-02-11 06:19:58查看全文 >>

触发器功能描述的四种方法(触发器功能描述的5种方法)

触发器功能描述的四种方法(触发器功能描述的5种方法)

什么叫窄沟效应当JFET或 MESFET沟道较短,<1um的情况下,这样的器件沟道内电场很高,载流子民饱合速度通过...

2024-02-11 06:06:36查看全文 >>

可激活触发器的语句(触发器触发后如何被激活)

可激活触发器的语句(触发器触发后如何被激活)

一、摘要本文主要以 Mysql 数据库为基础,对常用 SQL 语句进行一次深度总结,由于篇幅较长,难免会有些遗漏的地方,...

2024-02-11 06:46:10查看全文 >>

描述触发器的逻辑功能有三种方法(触发器逻辑功能有哪些描述方法)

描述触发器的逻辑功能有三种方法(触发器逻辑功能有哪些描述方法)

基本概念:触发—时钟脉冲边沿作用下的状态刷新称为触发。触发器—具有触发功能的存储单元称为触发器。触发器分类—主从触发器、...

2024-02-11 06:03:16查看全文 >>

成化十四年演员表全部(成化十四年电视剧演员表全部)

成化十四年演员表全部(成化十四年电视剧演员表全部)

备受瞩目的《成化十四年》于4月1日晚间在爱奇艺播出,这部由成龙监制、戏骨与鲜肉云集的网剧在播出前就引发诸多期待,然而播出...

2024-02-11 06:36:46查看全文 >>

成化十四年电视剧全集介绍(成化十四年48集免费电视连续剧)

成化十四年电视剧全集介绍(成化十四年48集免费电视连续剧)

现代人最大的共通弱点可能就是"懒",不仅懒得做事,也懒得等待。就拿追剧这件事来说,如果一部剧不能在前几集...

2024-02-11 06:30:26查看全文 >>

成化十四年演员表大全(成化十四年演员详细介绍)

成化十四年演员表大全(成化十四年演员详细介绍)

由爱奇艺和冠亚传媒联合出品,成龙监制,杨蓓、李密担任总制片人,根据梦溪石同名小说改编的青春美食探案剧《成化十四年》首度公...

2024-02-11 06:41:40查看全文 >>

电视剧成化十四年演员冬儿(成化十四年电视剧有女主么)

电视剧成化十四年演员冬儿(成化十四年电视剧有女主么)

看电视剧《成化十四年》被冬儿这个神童小吃货圈粉了,妥妥的机灵贪嘴小可爱,长得也太好看了!这样的萌娃谁能不喜欢!背案卷的速...

2024-02-11 06:08:32查看全文 >>

成化十四年电视剧演员表韩国(成化十四年电视剧介绍)

成化十四年电视剧演员表韩国(成化十四年电视剧介绍)

三个女人一台戏,那如果是三个男人吗?那可能会是一出大戏吧!《成化十四年》又一双男主的剧,又或者说是三男主的戏?近几年真的...

2024-02-11 06:28:32查看全文 >>

文档排行