今天考虑一个删除记录回收站的时候,突然想到了触发器这个东西,基本上之前也很少使用。废话不不多说,先看它的解释:
在MySQL中,触发器(Trigger)是一种特殊的存储过程,它会在指定的事件(例如插入、更新或删除数据)发生时自动执行。
触发器通常用于实现复杂的业务逻辑,例如在插入新数据时自动更新相关的记录、在删除数据时执行一些额外的清理操作等等。
MySQL中的触发器有两种类型:行级触发器和语句级触发器。行级触发器会在每一行数据受到影响时执行,而语句级触发器则会在每一次SQL语句执行完毕后执行一次。
看一个示例你就明白了:
CREATE TRIGGER log_deleted_user_menu_records AFTER UPDATE ON user_menu FOR EACH ROW
BEGIN
--第一次判断
IF
OLD.deletestatus = 'NOT_DELETED'
AND NEW.deletestatus = 'USER_DELETED' THEN
INSERT INTO deleted_records ( table_name, record_id, deleted_at, deletestatus )
VALUES
( 'user_menu', OLD.id, NOW(), 'USER_DELETED' );
-- 第二个判断
ELSEIF OLD.deletestatus = 'USER_DELETED'
AND NEW.deletestatus = 'TRASH_DELETED' THEN
UPDATE deleted_records
SET deleted_at = NOW(),
deletestatus = 'TRASH_DELETED'
WHERE
table_name = 'user_menu'
AND record_id = OLD.id;
-- 最后走的判断
ELSE UPDATE deleted_records
SET deleted_at = NOW(),
deletestatus = 'DELETED'
WHERE
table_name = 'user_menu'
AND record_id = OLD.id;
END IF;
END;
log_deleted_user_menu_records 触发器名称
AFTER UPDATE ON user_menu FOR EACH ROW 是指在user_menu表每一行发生变化后执行,(当然还可以在之前执行)
OLD.deletestatus 指user_menu字段中变化之前的deletestatus 值
NEW.deletestatus 那对应就是新值啦
其他语句一看就知道了,
然后测试一下,先看下面的user_menu表中id=3的一条记录,
此时deleted_records中是没有的,
下面我要改变id=3它的deletestatus值 了;
UPDATE test_database
.user_menu
SET deletestatus
= ‘USER_DELETED’ WHERE id
= 3
这个时候我们再来看记录表的数据;自动创建了一条记录,这就是触发器的作用;
然后再给小伙伴们说一下,触发器的注意事项
下面是触发器的优缺点和如何适当使用它们的一些注意事项:
优点:
- 数据完整性保障:触发器可以强制执行业务规则和数据完整性约束,例如强制某些列不允许为空、禁止插入重复数据等。
- 自动化操作:触发器可以自动执行一些操作,例如在插入、更新或删除数据时,同时更新其他表或列的值。
- 提高数据库性能:触发器可以减少应用程序对数据库的请求,从而减少网络延迟和服务器负载。
缺点:
- 难以维护:在大型数据库中,触发器可能会变得非常复杂,难以理解和维护。
- 降低性能:触发器的执行可能会降低数据库性能,特别是在处理大量数据时。
- 安全问题:触发器可能会被黑客利用,从而危及数据库的安全。
适当使用触发器需要注意以下几点:
- 仅在必要时使用触发器:在设计数据库时,应该仅在必要时使用触发器,以避免过多的复杂性和性能问题。
- 保持简单:尽量保持触发器的逻辑简单和易于维护。
- 测试和调试:在生产环境中使用触发器之前,应该对其进行彻底的测试和调试,以确保其正确性和稳定性。
- 安全性:在使用触发器时应该考虑安全问题,例如使用适当的安全措施来防止黑客利用触发器对数据库进行攻击。
总之,使用触发器可以提高数据完整性、自动化操作和提高数据库性能,但也需要注意其维护和性能问题,以及安全问题。