加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql 触发器 通知程序_MySQL触发器

发布时间:2022-12-07 15:26:34 所属栏目:MySql教程 来源:互联网
导读: 1. 概念
触发器(Trigger)是一个特殊的存储过程mysql触发器,它的执行不是由程序调用,也不是手工启动,而是由事件触发。
触发器经常用于加强数据的完整性约束和业务规则等。
2. 语法
CREAT

1. 概念

触发器(Trigger)是一个特殊的存储过程mysql触发器,它的执行不是由程序调用,也不是手工启动,而是由事件触发。

触发器经常用于加强数据的完整性约束和业务规则等。

2. 语法

CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件

ON 表名 FOR EACH ROW

BEGIN

触发器程序体

END

-- 触发器名称,它和MySQL中其他对象的命名方式

-- {BEFORE|AFTER} 触发器触发的时机

-- {INSERT|UPDATE|DELETE} 触发器事件

-- FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。

-- (针对insert和delete语句,每一行都触发)

mysql> desc student;

+-------+------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+------------------+------+-----+---------+----------------+

| id | int(10) unsigned | NO | PRI | NULL | auto_increment |

| name | varchar(50) | YES | | NULL | |

+-------+------------------+------+-----+---------+----------------+

2 rows in set (0.02 sec)

mysql> desc student_total;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| total | int(11) | YES | | NULL | |

+-------+---------+------+-----+---------+-------+

1 row in set (0.01 sec)

mysql> delimiter &&

mysql> create trigger student_insert_trigger after insert

-> on student for each row

-> BEGIN

-> update student_total set total=total+1;

-> END&&

mysql> delimiter ;

3. 查看触发器

通过show语句查看

show triggers\G

通过系统表查看

use information_shcema;

select * from tirggers\G

select * from triggers where TRIGGER_NAME = '触发器名称'\G

4. 删除触发器

drop trigger 触发器名称

mac触发角触发不了屏保_epoll水平触发和边缘触发_mysql触发器

5. 触发器示例

--安全地删除表

drop table if exists tab1;

5.1 增加tab1表记录后自动将记录添加到tab2中

5.1.1表结构

mysql> desc tab1;

+---------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------+-------------+------+-----+---------+-------+

| tab1_id | varchar(50) | YES | | NULL | |

+---------+-------------+------+-----+---------+-------+

1 row in set (0.02 sec)

mysql> desc tab2;

+---------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------+-------------+------+-----+---------+-------+

| tab2_id | varchar(50) | YES | | NULL | |

+---------+-------------+------+-----+---------+-------+

1 row in set (0.00 sec)

5.1.2 创建触发器

触发器中new和old的作用

针对update操作,new表示的是更新后的值,old表示的是原来的数据。

针对insert操作,new表示的是插入的值。

针对delete操作,old表示的是删除后的值。

触发器命名规范

表名触发时机动作

-- 插入触发器

mysql> delimiter $$

mysql> create trigger tab1_after_insert after insert

-> on tab1 for each row

-> BEGIN

-> insert into tab2(tab2_id) values(new.tab1_id);

-> END

-> $$

Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;

-- 删除触发器

mysql> delimiter $$

mysql> create trigger tab1_delete_after after delete

-> on tab1 for each rows

-> BEGIN

-> delete from tab2 where tab2_id = old.tab1_id;

-> END

-> $$

Query OK, 0 rows affected (0.01 sec)

mysql触发器_epoll水平触发和边缘触发_mac触发角触发不了屏保

mysql> delimiter ;

5.2 记录学生表的更新

5.2.1 表结构

-- 学生表

mysql> desc student1;

+--------------+-----------------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+--------------+-----------------------+------+-----+---------+----------------+

| student_id | int(11) | NO | PRI | NULL | auto_increment |

| student_name | varchar(30) | NO | | NULL | |

| student_sex | enum('male','female') | YES | | male | |

+--------------+-----------------------+------+-----+---------+----------------+

3 rows in set (0.00 sec)

-- 更新记录表

mysql> desc update_student1;

+---------------+---------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+---------------+---------+------+-----+---------+----------------+

| update_record | int(11) | NO | PRI | NULL | auto_increment |

| student_id | int(11) | NO | | NULL | |

| update_date | date | YES | | NULL | |

+---------------+---------+------+-----+---------+----------------+

3 rows in set (0.00 sec)

5.2.2 创建触发器

-- 更新学生表的同时也更新记录表

delimiter $$

mysql> create trigger student1_update_after after update

-> on student1 for each row

-> BEGIN

-> if new.student_id != old.student_id then

-> update update_student1 set student_id = new.student_id, update_date = now()

-> where student_id = old.student_id;

-> end if;

-> END

-> $$

delimiter ;

-- 删除学生表的时候也删除记录表

mysql> delimiter $$

mysql> create trigger student1_delete_before before delete

-> on student1 for each row

-> BEGIN

-> delete from update_student1

-> where student_id = old.student_id;

-> END

-> $$

delimiter ;

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!