数据库-触发器

定义

它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。

触发器的作用

可在写入数据表前,强制检验或转换数据。
触发器发生错误时,异动的结果会被撤销。
部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
可依照特定的情况,替换异动的指令 (INSTEAD OF)。
触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息

触发器的优点

(1)触发程序的执行是自动的。当对触发程序相关表的数据做出相应的修改后立即执行。
(2)触发程序可以通过数据库中相关的表进行层叠修改另外的表。
(3)触发程序可以实施比FOREIGN KEY约束、CHECK约束更为复杂的检查和操作。

语法

创建触发器

DELIMITER |
CREATE TRIGGER `<库名>`.`触发器名称>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON [dbo]<tableName> //dbo代表该表的所有者
FOR EACH ROW
BEGIN
	触发器程序体;
END |

<触发器名称>			 		 最多64个字符,它和MySQL中其他对象的命名方式一样
{ BEFORE | AFTER } 		     触发器时机
{ INSERT | UPDATE | DELETE } 触发的事件
ON <表名称> 					 标识建立触发器的表名,即在哪张表上建立触发器
FOR EACH ROW                 触发器的执行间隔:FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次
<触发器程序体>                 要触发的SQL语句:可用顺序,判断,循环等语句实现一般程序需要的逻辑功能

查看触发器

 通过系统表triggers查看
mysql> use information_schema
mysql> select * from triggers\G     查看所有触发器
mysql> select * from triggers  where trigger_name='触发器名称'\G    查看某个触发器

删除触发器

DROP TRIGGER 解发器名称

实例

例一

1、创建表
mysql> create table stu(
    -> id int primary key auto_increment,
    -> name char(20)
    -> );

mysql> create table stu_total (id int );

2、给表中插入数据
mysql> insert into stu(name) values('a');
mysql> insert into stu_total values(1);

3、创建事件为insert的触发器
mysql> \d $$
mysql> create trigger stu_insert after insert
    -> on stu
    -> for each row
    -> begin
    ->  update stu_total set id=id+1;
    -> end $$
Query OK, 0 rows affected (0.01 sec)
mysql> \d ;

4、插入数据测试
mysql> insert into stu(name) values('b'),('c');
Query OK, 2 rows affected (0.15 sec)
Records: 2  Duplicates: 0  Warnings: 0

5、查看是否成功
mysql> select * from stu_total;
+------+
| id   |
+------+
|    3 |
+------+

6、创建事件为delete的触发器
mysql> create trigger stu_delete after delete 
    -> on stu
    -> for each row
    -> begin
    ->  update stu_total set id=id-1;
    -> end $$
mysql> \d ;

7、删除数据
mysql> delete from stu;

8、查看是否成功
mysql> select * from stu_total;
+------+
| id   |
+------+
|    0 |
+------+

9、查看触发器
mysql> use information_schema
mysql> select * from triggers\G     查看所有的触发器
mysql> select * from triggers  where trigger_name='stu_insert'\G   查看名为stu_insert的触发器
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: test
              TRIGGER_NAME: stu_insert
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: test
        EVENT_OBJECT_TABLE: stu
              ACTION_ORDER: 1
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: begin
 update stu_total set id=id+1;
end
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: 2021-01-22 03:00:53.90
                  SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
                   DEFINER: root@localhost
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: utf8_general_ci

10、删除触发器

例二

1、创建表
mysql> create  table tab1(
    -> id int primary key auto_increment,
    -> name varchar(50),
    -> sex enum('m','f'),
    -> age int
    -> );

mysql> create table tab2(
    -> id int primary key auto_increment,
    -> name varchar(50),
    -> salary double(10,2)
    -> );


2、创建触发器
建立触发器作用:tab1表删除记录后,自动将tab2表中对应记录删除
(1)删除事件
mysql> delimiter $$
mysql> create trigger t1 after delete
    -> on tab1
    -> for each row
    -> begin
    ->  delete from tab2
    ->  where name=old.name;
    -> end$$
mysql> delimiter ;

(2)更新事件触发器
mysql> \d $$
mysql>  create trigger t2 after update
    ->  on tab1
    ->  for each row
    ->  begin
    -> update tab2
    -> set name=new.name
    -> where name=old.name;
    ->  end$$
mysql> \d ;

(3)插入事件触发器
mysql>  \d $$
mysql>  create trigger t3 after insert
    ->  on tab1
    ->  for each row
    ->  begin
    -> insert into tab2(name)
    -> values(new.name);
    ->  end$$
mysql> \d ;

3、测试
(1)插入测试
mysql> insert into tab1(name) values('tom');
mysql> select * from tab2;
+----+------+--------+
| id | name | salary |
+----+------+--------+
|  1 | tom  |   NULL |
+----+------+--------+

(2)更新测试
mysql> update tab1
    -> set name='wang'
    -> where name='tom';
mysql> select * from tab2;
+----+------+--------+
| id | name | salary |
+----+------+--------+
|  1 | wang |   NULL |
+----+------+--------+

(3)删除测试
mysql> delete from tab1;
mysql> select * from tab2;
Empty set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值