mysql高级【4】:mysql触发器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26584263/article/details/82222032

在学习之前确定自己的mysql的版本如果使用最新的就没有下面的限制:

MySQL5.7.2版本之前,每个表最多可以定义六个触发器。

(1)BEFORE INSERT - 在数据插入表之前被激活触发器。

(2)AFTER INSERT - 在将数据插入表之后激活触发器。

(3)BEFORE UPDATE - 在表中的数据更新之前激活触发器。

(4)AFTER UPDATE - 在表中的数据更新之后激活触发器。

(5)BEFORE DELETE - 在从表中删除数据之前激活触发器。

(6)AFTER DELETE - 从表中删除数据之后激活触发器。

5.7.2之后的版本就可以新建多个触发器,并且名称命名也没有那么多严格了,可以随意命名, 但是很多公司还是使用以前的命名方式,并且以前的命名方式也通用,容易理解。

触发器可能使用的场景有:当有个数据表修改了要记录一下以前被修改的值以及修改的人和时间等

1、触发器的创建

新建一个表

 create table person(
    id int auto_increment primary key,
    name varchar(20),
    age int);

在新建一个表来保存修改person这个表里面的信息

create table person_history(
     user_name varchar(20),
     user_age int,
     action varchar(20),
     user varchar(20),
     update_time datetime()
 );

触发器格式是:
CREATE TRIGGER  trigger_name  // trigger_name触发器的名称
[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_name // table_name表名
FOR EACH ROW [FOLLOWS|PRECEDES] existing_trigger_name // 如果一个触发事件单个触发器或多个触发器按照创建顺序执行row后面的可以不写,existing_trigger_name触发器的名称,这个触发器是其他的哦,follows是在这个触发器之后执行,precedes是在哪个触发器之前执行
BEGIN
… //里面就是逻辑处理或者sql操作语句,不能存放结果集的哦。
END

新建新增成功后触发器

 create trigger after_person_insert
      after insert on person
      for each row
      begin
      insert into person_history(user_name,user_age,action,user,update_time)
      values(new.name,new.age,"新增",user(),now());
      end 

修改之后的触发器

create trigger after_person_update
            after update on person
            for each row
            begin
       insert into person_history(user_name,user_age,action,user,update_time)
            values(old.name,old.age,"修改",user(),now());
      end 

新增表person两条数据
mysql> insert into person(name,age)
    ->  values("张三",21),("李思",22); //
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

新增成功以后就可以看到person_history表里面通过触发触发器新增了两条数据

mysql> select * from person_history ; //
+-----------+----------+--------+----------------+---------------------+
| user_name | user_age | action | user           | update_time         |
+-----------+----------+--------+----------------+---------------------+
| 张三      |       21 | 新增   | root@localhost | 2018-08-30 16:19:19 |
| 李思      |       22 | 新增   | root@localhost | 2018-08-30 16:19:19 |
+-----------+----------+--------+----------------+---------------------+
2 rows in set (0.00 sec)

修改表person里面姓名是张三的改成王五18岁,又把王五改成赵柳100岁

mysql> update person set name="王五" ,age = 18 where name ="张三";
    -> update person set name="赵柳", age = 100 where name ="王五";//
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

修改成功以后就可以看到person_history表里面通过触发触发器新增了两条数据

mysql> select * from person_history; //
+-----------+----------+--------+----------------+---------------------+
| user_name | user_age | action | user           | update_time         |
+-----------+----------+--------+----------------+---------------------+
| 张三      |       21 | 新增   | root@localhost | 2018-08-30 16:32:37 |
| 李思      |       22 | 新增   | root@localhost | 2018-08-30 16:32:37 |
| 张三      |       21 | 修改   | root@localhost | 2018-08-30 16:33:47 |
| 王五      |       18 | 修改   | root@localhost | 2018-08-30 16:33:47 |
+-----------+----------+--------+----------------+---------------------+
4 rows in set (0.00 sec)

上面都只是一个触发事件一个触发器,现在在刚才的修改的触发事件上新增一个触发器,并且这个触发器是在after_person_udpate之前执行的

 create trigger after_person_update_one
      after update on person
      for each row precedes after_person_update
      begin
      update person_history set user= "调皮的小孩把user值改了!^_^ ";
      end ;

现在把刚才的赵柳的年龄改成18 

mysql> update person set age = 18 where name = "赵柳"; //
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

修改成功以后触发after_person_update_one触发器先执行,把已有的数据的user修改了,然后触发触发器after_person_update新增了一条数据:

mysql> select * from person_history; //
+-----------+----------+--------+------------------------------+---------------------+
| user_name | user_age | action | user                         | update_time         |
+-----------+----------+--------+------------------------------+---------------------+
| 张三      |       21 | 新增   | 调皮的小孩把user值改了!^_^  | 2018-08-30 16:32:37 |
| 李思      |       22 | 新增   | 调皮的小孩把user值改了!^_^  | 2018-08-30 16:32:37 |
| 张三      |       21 | 修改   | 调皮的小孩把user值改了!^_^  | 2018-08-30 16:33:47 |
| 王五      |       18 | 修改   | 调皮的小孩把user值改了!^_^  | 2018-08-30 16:33:47 |
| 赵柳      |      100 | 修改   | root@localhost               | 2018-08-30 16:35:49 |
+-----------+----------+--------+------------------------------+---------------------+
5 rows in set (0.00 sec)

同一个触发事件新增了多个触发器弄完,下面讲讲触发器相关的操作。

2、触发器的显示

触发器的查询

格式:SHOW TRIGGERS [FROM|IN] database_name
         [LIKE expr | WHERE expr];

show triggers;可以查看到当前数据库下的所有触发器

show triggers from database_name;可以查看到指定数据库下面所有的触发器

show triggers from database_name like  table_name; //相关数据表下面所用的触发器

例如:

mysql> show triggers from datademo  like  'person'; //

+---------------------+--------+--------+-----------------------------------------------------------------------------------------------------------------------------
| Trigger             | Event  | Table  | Statement                                                                                                                                               | Timing | Created                | sql_mode                                   | Definer        | character_set_client | collation_connection | Database Collation |
+---------------------+--------+--------+-----------------------------------------------------------------------------------------------------------------------------
| after_person_insert | INSERT | person | begin
      insert into person_history(user_name,user_age,action,user,update_time)
      values(new.name,new.age,"新增",user(),now());
      end        | AFTER  | 2018-08-30 16:18:27.12 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | gbk                  | gbk_chinese_ci       | utf8mb4_0900_ai_ci |
| after_person_update | UPDATE | person | begin
       insert into person_history(user_name,user_age,action,user,update_time)
            values(old.name,old.age,"修改",user(),now());
      end | AFTER  | 2018-08-30 16:31:54.13 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | gbk                  | gbk_chinese_ci       | utf8mb4_0900_ai_ci |
+---------------------+--------+--------+-----------------------------------------------------------------------------------------------------------------------------
2 rows in set (0.00 sec)

3、触发器的删除、修改

触发器不像表和视图、存储过程、一样可以修改,都是删除了再去新建的。

DROP TRIGGER table_name.trigger_name;

例如:

mysql> drop trigger after_person_update_one ;//
Query OK, 0 rows affected (0.04 sec)

4、注意要点

mysql注意要点:

(1)在SHOWLOAD DATALOAD TABLEBACKUP DATABASERESTOREFLUSHRETURN语句之上。

(2)隐式或明确提交或回滚的语句,如COMMITROLLBACKSTART TRANSACTIONLOCK/UNLOCK TABLESALTERCREATEDROPRENAME等。

(3)准备语句,如PREPAREEXECUTE等。

(4)使用动态SQL语句。

以上要点不能使用触发器的。

(5)从MySQL 5.1.4版本开始,触发器可以调用存储过程或存储函数。

   (6)  要执行SHOW TRIGGERS语句,您必须具有SUPER权限

(7)在为INSERT定义的触发器中,可以仅使用NEW关键字。不能使用OLD关键字。但是,在为DELETE定义的触发器中,没有新行,因此您只能使用OLD关键字。在UPDATE触发器中,OLD是指更新前的行,而NEW是更新后的行。

《………………………………………………菜鸟起飞中,请各位走过路过的多多指教……………………………………》

猜你喜欢

转载自blog.csdn.net/qq_26584263/article/details/82222032