当前位置:网站首页>MySQL的触发器
MySQL的触发器
2022-07-04 12:51:00 【火眼猊】
- 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是,触发器无需调用,当数据库表中的执行DML操作时自动触发这个SQL片段的执行,无需手动调用。
- 在MySQL,只有执行INSERT,DELETE,UPDATE操作时才能触发触发器的执行。
- 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
- 使用别名OLD和NEW来应用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。
触发器的特性:
- 什么条件会触发:I、D、U
- 什么时候触发:在增删改之前或之后
- 触发频率:针对每一行执行
- 触发器定义在表上,附着在表上
基本操作
创建触发器
1.创建只有一个执行语句的触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
执行语句;
2.创建有多个执行语句的触发器
CREATE TRIGGER 触发器名 BEFORE||AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END;
例如:
-- 数据准备
CREATE DATABASE mydb10_trigger;
USE mydb10_trigger;
-- 用户表
CREATE TABLE user(
uid INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
-- 用户信息操作日志表
CREATE TABLE user_logs(
id INT PRIMARY KEY AUTO_INCREMENT,
time TIMESTAMP,
log_text VARCHAR(255)
);
-- 需求一:当user表添加一行数据,则会自动在user_log添加日志记录
-- 定义触发器:trigger_test1
CREATE TRIGGER trigger_test1 AFTER INSERT
ON user FOR EACH ROW
INSERT INTO user_logs VALUES (NULL,NOW(),'有新用户添加');
-- 在user表添加数据,让触发器自动执行
INSERT INTO user VALUES(1,'张三','123456');
INSERT INTO user VALUES(2,'李四','234567'),(3,'王五','345678');
-- 需求二:当user表数据被修改,则会自动在user_log添加日志记录
DELIMITER $$
CREATE TRIGGER trigger_test2 BEFORE UPDATE
ON user FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES (NULL,NOW(),'有用户信息被修改');
END $$
DELIMITER ;
-- 在user表修改数据,让触发器自动执行
UPDATE user SET password = '888888' WHERE uid = 1;
UPDATE user SET password = '666666' WHERE uid = 1;
NEW和OLD
概念:MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体的:
触发器类型 | 触发器类型NEW和OLD的使用 |
---|---|
INSERT型触发器 | NEW表示将要或者已经新增的数据 |
UPDATE型触发器 | OLD表示修改之前的数据,NEW表示将要或已经修改后的数据 |
DELETE型触发器 | OLD表示将要或者已经删除的数据 |
方法:NEW.columnName (columnName为相应数据表某一列名)
-- 数据准备
CREATE DATABASE mydb10_trigger;
USE mydb10_trigger;
-- 用户表
CREATE TABLE user(
uid INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL
);
-- 用户信息操作日志表
CREATE TABLE user_logs(
id INT PRIMARY KEY AUTO_INCREMENT,
time TIMESTAMP,
log_text VARCHAR(255)
);
-- 需求一:当user表添加一行数据,则会自动在user_log添加日志记录
-- 定义触发器:trigger_test1
CREATE TRIGGER trigger_test1 AFTER INSERT
ON user FOR EACH ROW
INSERT INTO user_logs VALUES (NULL,NOW(),'有新用户添加');
-- 在user表添加数据,让触发器自动执行
INSERT INTO user VALUES(1,'张三','123456');
INSERT INTO user VALUES(2,'李四','234567'),(3,'王五','345678');
-- 需求二:当user表数据被修改,则会自动在user_log添加日志记录
DELIMITER $$
CREATE TRIGGER trigger_test2 BEFORE UPDATE
ON user FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES (NULL,NOW(),'有用户信息被修改');
END $$
DELIMITER ;
-- 在user表修改数据,让触发器自动执行
UPDATE user SET password = '888888' WHERE uid = 1;
UPDATE user SET password = '666666' WHERE uid = 1;
-- INSERT类型的触发器
-- NEW
-- 定义触发器:trigger_test3
CREATE TRIGGER trigger_test3 AFTER INSERT
ON user FOR EACH ROW
INSERT INTO user_logs VALUES (NULL,NOW(),CONCAT('有新用户添加,信息为:',NEW.uid,NEW.username,NEW.password));
INSERT INTO user VALUES(4,'赵六','234567');
-- UPDATE类型的触发器
-- OLD
CREATE TRIGGER trigger_test4 AFTER UPDATE
ON user FOR EACH ROW
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT('有用户信息修改,信息修改之前为:',OLD.uid,OLD.username,OLD.password));
UPDATE user SET password ='9999999' WHERE uid=4;
-- NEW
CREATE TRIGGER trigger_test5 AFTER UPDATE
ON user FOR EACH ROW
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT_WS(',','有用户信息修改,信息修改之后为:',NEW.uid,NEW.username,NEW.password));
UPDATE user SET password ='000000' WHERE uid=1;
-- DELETE类型的触发器
-- OLD
CREATE TRIGGER trigger_test6 AFTER DELETE
ON user FOR EACH ROW
INSERT INTO user_logs VALUES(NULL,NOW(),CONCAT_WS(',','有用户信息被删除,被删除用户信息为:',OLD.uid,OLD.username,OLD.password));
DELETE FROM user WHERE uid=4;
其他操作
查看触发器
方法:
SHOW triggers;
删除触发器
方法:
DROP TRIGGER [IF EXISTS] trigger_name;
例如:
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER IF EXISTS trigger_test6;
注意事项
- MySQL中触发器不能对本表进行insert,update,delete操作,以免递归循环触发。
- 尽量少使用触发器,假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么insert的效率就非常低了。
- 触发器是针对每一行的;对增删改非常频繁的表上切忌不要使用触发器,因为他会非常消耗资源。
边栏推荐
- Understand chisel language thoroughly 09. Chisel project construction, operation and testing (I) -- build and run chisel project with SBT
- Mask wearing detection based on yolov1
- Oppo find N2 product form first exposure: supplement all short boards
- Code hoof collection of wonderful secret place
- R语言ggplot2可视化:gganimate包创建动画图(gif)、使用anim_save函数保存gif可视化动图
- Use the default route as the route to the Internet
- 去除重複字母[貪心+單調棧(用數組+len來維持單調序列)]
- Whether the loyalty agreement has legal effect
- go语言中的文件创建,写入,读取,删除(转)
- Xcode 异常图片导致ipa包增大问题
猜你喜欢
安装Mysql
Applet live + e-commerce, if you want to be a new retail e-commerce, use it!
Unittest框架中引入TestFixture
C # WPF realizes the real-time screen capture function of screen capture box
gin集成支付宝支付
China Post technology rushes to the scientific innovation board: the annual revenue is 2.058 billion, and the postal group is the major shareholder
Unity Shader学习(三)试着绘制一个圆
Apple 5g chip research and development failure: continue to rely on Qualcomm, but also worry about being prosecuted?
Learn kernel 3: use GDB to track the kernel call chain
Use of tiledlayout function in MATLAB
随机推荐
go语言中的文件创建,写入,读取,删除(转)
Understand chisel language thoroughly 03. Write to the developer of Verilog to chisel (you can also see it without Verilog Foundation)
R语言ggplot2可视化:gganimate包创建动画图(gif)、使用anim_save函数保存gif可视化动图
Incremental ternary subsequence [greedy training]
MySQL version 8 installation Free Tutorial
mac redis安装与使用,连接远程服务器 redis
Understand chisel language thoroughly 11. Chisel project construction, operation and test (III) -- scalatest of chisel test
R language ggplot2 visualization: gganimate package creates animated graph (GIF) and uses anim_ The save function saves the GIF visual animation
Deming Lee listed on Shenzhen Stock Exchange: the market value is 3.1 billion, which is the husband and wife of Li Hu and Tian Hua
Ruiji takeout notes
Detailed index of MySQL
IP 实验室月复盘 · 第 5 期
Test evaluation of software testing
学内核之三:使用GDB跟踪内核调用链
[C question set] of VII
Unittest框架中引入TestFixture
Understand chisel language thoroughly 04. Chisel Foundation (I) - signal type and constant
Unittest框架之断言
The game goes to sea and operates globally
Unity shader learning (3) try to draw a circle