MySQL触发器

触发器是与表有关的数据库对象,指在insert/update/delete之前(Before)或之后(After),触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据库校验等操作。

使用别名old和new来引用触发器中发生的记录内容,这与其他的数据库是相似的。现在触发器还只是支持行级触发,不支持语句级触发。

目录

1、行级触发和语句级触发

2、触发器类型

3、语法

3.1、创建

3.2、查看

3.3、删除

 4、案例

4.1、表结构准备—创建日志表user_logs

4.2、插入数据触发器

4.2.1、创建插入数据触发器

4.2.2、 测试

4.3、修改数据触发器

4.3.1、创建修改数据触发器

4.3.2、 测试

4.4、删除数据触发器

4.4.1、创建修改数据触发器

4.2.2、测试


1、行级触发和语句级触发

        行级触发:例如update操作,如果更新了5行,那么就触发5次;

        语句级触发:一条update语句,不管影响多少行,只会触发一次

不管这两个概念懂没懂,反正就是使用行级触发就行啦。

2、触发器类型

触发器类型
触发器类型NEW和OLD
insert型触发器New表示将要或者已经新增的数据
update型触发器OLD表示修改之前的数据,NEW表示修改之后的数据
DELETEOLD表示将要或者已经删除的数据

总结一下就是说,NEW是之前没有的数据,你想insert插入肯定是插入最新的数据。update的话可以是更新之前的数据,也就是OLD,也可以是更新之后的数据,也就是NEW。DELETE的话,你既然删除了,那肯定对于数据库来说删除的数据肯定是OLD的数据

3、语法

3.1、创建

CREATE TRIGGER TRIGGER_name
	BEFORE/AFTER INSERT/UPDATE/DELETE
	ON TABLE_name FOR each ROW ---行级触发器
	BEGIN
		TRIGGER_stmt;--触发器的逻辑实现
	END;

3.2、查看

show TRIGGERS;

3.3、删除

DROP TRIGGER [schema_name.]trigger_name;-------如果没有指定schema_name,默认当前数据库

 4、案例

通过触发器记录tb_user表的数据变更日志,将变更日志插入到日志表user_logs中,包含增加、修改删除;

4.1、表结构准备—创建日志表user_logs

CREATE TABLE user_logs(
	id int(11) not NULL auto_increment,
	operation varchar(20) NOT NULL COMMENT '操作类型,INSERT/UPDATE/DELETE',
	operate_time DATETIME not NULL COMMENT '操作时间',
	operate_id INT(11) NOT NULL COMMENT '操作的id',
	operate_params varchar(500) COMMENT '操作参数',
	PRIMARY KEY(id)
	)ENGINE=INNODB DEFAULT CHARSET=utf8;
	

4.2、插入数据触发器

4.2.1、创建插入数据触发器

插入数据用的是new

    CREATE TRIGGER tb_user_insert_trigger
        AFTER INSERT ON tb_user FOR EACH ROW
    BEGIN
            INSERT INTO user_logs(id,operation,operate_time,operate_id,operate_params) 
    VALUES
        (NULL,'INSERT',now(),new.id,CONCAT('插入的数据内容为:
         id=',new.id,',name=',new.name,',age=',new.age,',gender=',new.gender,',phone=',new.phone,'email=',new.email
         ))    ;            
    END; 
        
   

4.2.2、 测试

-----查看

    SHOW triggers;

----插入数据到tb_user    

INSERT into tb_user VALUES(NULL,'三皇子',67,'男','182524585','fgeyhwgfqe@qq.com');

测试完毕之后,日志表user_logs数据正常插入,且在tb_user中插入数据正确

4.3、修改数据触发器

4.3.1、创建修改数据触发器

修改之后的数据用的是new,之前是OLD

	CREATE TRIGGER tb_user_update_trigger
		AFTER UPDATE ON tb_user FOR EACH ROW
	BEGIN
			INSERT INTO user_logs(id,operation,operate_time,operate_id,operate_params) 
	VALUES
		(NULL,'UPDATE',now(),new.id,CONCAT('更新之前的数据:
		 id=',old.id,',name=',old.name,',age=',old.age,',gender=',old.gender,',phone=',old.phone,'email=',old.email,
		 '更新之后的数据:
		 id=',new.id,',name=',new.name,',age=',new.age,',gender=',new.gender,',phone=',new.phone,'email=',new.email
		 ))	;			
	END; 
		
        
   

4.3.2、 测试

-----查看

    SHOW triggers;

----修改数据到tb_user    

	UPDATE  tb_user SET phone='123456789' WHERE id=8;

测试完毕之后,日志表user_logs数据正常更新,且在tb_user中更新数据正确

4.4、删除数据触发器

4.4.1、创建修改数据触发器

删除用的是OLD

CREATE TRIGGER tb_user_delete_trigger
		AFTER DELETE ON tb_user FOR EACH ROW
	BEGIN
			INSERT INTO user_logs(id,operation,operate_time,operate_id,operate_params) 
	VALUES
		(NULL,'DELETE',now(),old.id,CONCAT('删除之前之前的数据:
		 id=',old.id,',name=',old.name,',age=',old.age,',gender=',old.gender,',phone=',old.phone,'email=',old.email))	;			
	END; 
		
        
   

4.2.2、测试

----查看

    SHOW triggers;

----删除数据到tb_user    

	DELETE  FROM tb_user WHERE id=9;

测试完毕之后,日志表user_logs数据正常删除,且在tb_user中删除数据正确

 

  • 31
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值