Cmd Markdown地址
在某个表发生更改(DELETE、INSERT、UPDATE)时自动处理某些事情。
删除触发器
-- 删除触发器
DROP TRIGGER new_user;
创建触发器
创建触发器:
1、唯一的名;
2、关联的表;
3、响应活动(DELETE、INSERT、UPDATE);
4、何时执行(处理前/后)。
注意:触发器只支持表,不支持触发器和临时表。
INSERT触发器
注意:
1、可使用NEW访问被插入的数据;
2、BEFORE INSERT 触发器允许更改被插入的值;
3、AUTO_INCREAMENT列,NEW在INSERT执行前包含0,在INSERT执行后包含心的自增长值。
AFTER INSERT 示例:
-- 创建一个INSERT触发器,插入完成后返回插入的ID。
CREATE TRIGGER new_user
AFTER INSERT ON users
FOR EACH ROW SELECT NEW.id;
-- 执行插入语句
INSERT INTO users(str_name, str_tel)('xuejianhui', '15657119571');
BEFORE INSERT 示例:
-- 创建BEFORE INSERT触发器,插入前修改对应的值。
DROP TRIGGER IF EXISTS bf_dev_irt_mdf_db;
CREATE TRIGGER bf_dev_irt_mdf_db BEFORE INSERT ON device
FOR EACH ROW BEGIN
IF NEW.nProductType = 30001 THEN
SET NEW.strPassword = MD5(NEW.strPassword);
END IF;
END;
-- 执行插入测试
INSERT INTO device (strPassword, nProductType) VALUES ('12345', 30001);
UPDATE触发器
注意:可使用OLD访问只读的被删除的行。
-- 创建一个DELETE触发器,将实时日志中被删除的数据插入到历史日志表。
CREATE TRIGGER delete_real_logs
BEFORE DELETE ON real_logs
FOR EACH ROW
BEGIN
INSERT INTO history_logs(...) VALUES(...);
END;
UPDATE触发器
注意:
1、NEW和OLD都可用;
2、BEFORE UPDATE中,允许更改NEW中的值;
3、OLD中的值为只读。
-- 创建一个UPDATE触发器,更新用户表时转换名称的大小写。
CREATE TRIGGER update_user_name
BEFORE UPDATE ON users
FOR EACH ROW
SET NEW.str_name = UPPER(NEW.str_name);
总结
注意:
1、创建触发器可能需要特殊的安全访问权限;
2、触发器可用来检查数据的一致性;
3、可用来记录操作流水;
4、MySQL触发器不支持调用存储过程。