page contents

mysql触发器

触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。


attachments-2020-04-tNJ5fUru5e9e8b13d04f6.png

触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。

和存储过程一样,很少使用。


(1)、触发器的作用

  1.可在写入数据表前,强制检验或转换数据。

  2.触发器发生错误时,异动的结果会被撤销。

  3.部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

  4.可依照特定的情况,替换异动的指令 (INSTEAD OF)。


(2)、创建触发器

创建测试环境

mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)
 
mysql> use test_db;
Database changed
mysql> create table user_tb(id int,name varchar(20));
Query OK, 0 rows affected (0.03 sec)
 
mysql> create table job_tb(uid int,job varchar(20));
Query OK, 0 rows affected (0.04 sec)

创建触发器语句如下:  

create trigger [触发器名称] [before|after] [insert|update|delete] on [表名] for each row
[触发的动作,一个update或insert或delete的SQL语句;]
[新的结束字符]

before和after是触发时间,insert、update和delete是监视事件。

并且因为包含一个触发动作的SQL语句,所以也要使用delimiter [新字符]。

实例

mysql> delimiter //
mysql> create trigger insert_job after insert on user_tb for each row
    -> insert into job_tb values (1,'老师');
    -> //
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into user_tb values(1,'张三')//
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from user_tb//
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
+------+--------+
1 row in set (0.00 sec)
 
mysql> select * from job_tb//
+------+--------+
| uid  | job    |
+------+--------+
|    1 | 老师   |
+------+--------+
1 row in set (0.00 sec)

注意:触发器与监视表不能是同一个,否则会报1442的错误。


(3)、查看触发器

show create trigger [触发器名称];  查看指定触发器

show triggers;  查看所有触发器

mysql> show create trigger insert_job\G  //查看指定触发器
*************************** 1. row ***************************
               Trigger: insert_job
              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
SQL Original Statement: CREATE DEFINER=`root`@`localhost` trigger insert_job after insert on user_tb for each row
insert into job_tb values (1,'老师')
  character_set_client: utf8
  collation_connection: utf8_general_ci
    Database Collation: utf8_general_ci
               Created: 2019-06-13 11:51:28.87
1 row in set (0.00 sec)
 
mysql> show triggers\G  //查看所有触发器
*************************** 1. row ***************************
             Trigger: insert_job
               Event: INSERT
               Table: user_tb
           Statement: insert into job_tb values (1,'老师')
              Timing: AFTER
             Created: 2019-06-13 11:51:28.87
            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
1 row in set (0.00 sec)


(4)、删除触发器

drop trigger [触发器名称];

mysql> drop trigger insert_job//
Query OK, 0 rows affected (0.00 sec)
 
mysql> show triggers\G
Empty set (0.00 sec)


(5)、扩展

由于触发器其实是一种特殊的存储过程,所以触发动作其实可以使用begin [SQL语句集] end来扩展其使用方法!



1

  • 发表于 2020-04-21 13:56
  • 阅读 ( 523 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章