MySQL触发器
2021/9/14 19:04:49
本文主要是介绍MySQL触发器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
MySQL触发器
1、语法
单条sql得触发器
CREATE TRIGGER -- 固定写法 trigger_name -- 触发器名字 trigger_time -- 触发时间 BEFORE、AFTER trigger_event -- 触发事件INSERT、DELETE或者UPDATE ON tb_name -- 作用于哪张表上 FOR EACH ROW -- 固定写法 trigger_stmt -- 一条或多条sql,多条使用分号隔开
trigger_name:触发器的名称
tirgger_time:触发时机,为BEFORE或者AFTER
trigger_event:触发事件,为INSERT、DELETE或者UPDATE
tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
所以可以说MySQL创建以下六种触发器:
BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE
多条sql得触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句列表(分号隔开) END
**tips:**一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突
为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||
当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;
DELIMITER || CREATE TRIGGER demo BEFORE DELETE ON users FOR EACH ROW BEGIN INSERT INTO logs VALUES(NOW()); INSERT INTO logs VALUES(NOW()); END || DELIMITER ;
上面的语句中,开头将结束符号定义为 ||,中间定义一个触发器,一旦有满足条件的删除操作
就会执行BEGIN和END中的语句,接着使用||结束
最后使用DELIMITER ; 将结束符号还原
2、trigger_time
只有两个值,一个是BEFORE
,一个是AFTER
,意思是在trigger_event执行前触发触发器,还是在trigger_event执行后触发
3、trigger_event
触发器类型 | 激活触发器语句 |
---|---|
INSERT | INSERT, LOAD DATA, REPLACE |
UPDATE | UPDATE |
DELETE | DELETE, REPLACE |
load data语句是将文件的内容插入到表中,相当于是insert语句,
replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的
数据和原来的primary key或者unique相同的时候,会删除原来的数据,然后增加一条新的数据,所以有的时
候执行一条replace语句相当于执行了一条delete和insert语句。
4、OLD和NEW的使用
触发类型 | NEW和OLD的使用 |
---|---|
INSERT | NEW表示将要或者已经新增的数据 |
UPDATE | OLD用来表示将要或者已经被删除的语句,NEW表示将要或者已经修改的数据 |
DELETE | OLD表示将要或者已经删除的数据 |
NEW.columnname
:新增行的某列数据
OLD.columnname
:删除行的某列数据
5、触发器的使用
-- 用户users表 CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL, `add_time` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`(250)) USING BTREE ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1; -- 日志logs表: CREATE TABLE `logs` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `log` varchar(255) DEFAULT NULL COMMENT '日志说明', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表'; -- 需求是:当在users中插入一条数据,就会在logs中生成一条日志信息。 -- 创建触发器: DELIMITER $ CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW BEGIN DECLARE s1 VARCHAR(40)character set utf8; DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集 SET s2 = " is created"; SET s1 = CONCAT(NEW.name,s2); #函数CONCAT可以将字符串连接 INSERT INTO logs(log) values(s1); END $ DELIMITER ;
这篇关于MySQL触发器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-02MySQL 3主集群搭建
- 2024-12-25如何部署MySQL集群资料:新手入门教程
- 2024-12-24MySQL集群部署资料:新手入门教程
- 2024-12-24MySQL集群资料详解:新手入门教程
- 2024-12-24MySQL集群部署入门教程
- 2024-12-24部署MySQL集群学习:新手入门教程
- 2024-12-24部署MySQL集群入门:一步一步搭建指南
- 2024-12-07MySQL读写分离入门:轻松掌握数据库读写分离技术
- 2024-12-07MySQL读写分离入门教程
- 2024-12-07MySQL分库分表入门详解