SQL 入门 14:SQL 触发器与事件:自动化数据处理

讲触发器和事件,数据库的自动化神器,表改动或定时任务都能搞定。跟着注释走,边看边整。

学习内容

  1. 触发器(Trigger)
  • 检查数据完整性。
  • 记录操作日志(审计)。
  • 自动算衍生数据。
  • 强制业务规则。
  • 同步其他表。
  • 特殊存储过程,表有特定操作(INSERT、UPDATE、DELETE)时自动跑。
  • 干啥用?
  • 命名一般是 表名_after/before_操作,如 payments_after_insert。
  • 用 NEW 访问新数据,OLD 访问旧数据。不能改自身表。
  • 查看与删除触发器

    • SHOW TRIGGERS 列出触发器,可加 LIKE 筛选。
    • DROP TRIGGER 删除,加 IF EXISTS 防报错。
  • 触发器审计

    • 触发器可记录操作到审计表,存谁干了啥、啥时候干的。
  • 事件(Event)

    • 定时任务,指定时间或间隔跑 SQL 或存储过程。
    • 需开启 event_scheduler。
    • 支持单次执行(AT)或周期执行(EVERY ... STARTS ... ENDS)。

    示例代码与讲解

    1. 创建触发器

    DELIMITER $$

    CREATE TRIGGER payments_after_insert

    AFTER INSERT ON payments

    FOR EACH ROW

    BEGIN

    UPDATE invoices

    SET payment_total = payment_total + NEW.amount

    WHERE invoice_id = NEW.invoice_id;

    END $$

    DELIMITER ;

    • 在 payments 插入数据后,自动更新 invoices 的 payment_total,加新插入的 amount。
    • AFTER INSERT 表示插入后触发,FOR EACH ROW 每行都跑。
    • 用 NEW.invoice_id 和 NEW.amount 访问新数据。
    • 不能改 payments 本身,不然死循环。

    INSERT INTO payments

    VALUES (DEFAULT, 5, 3, '2019-01-01', 888, 1);

    • 插一条 payments 数据,invoices 自动同步更新。

    2. 查看与删除触发器

    SHOW TRIGGERS;

    • 列出所有触发器。

    SHOW TRIGGERS LIKE 'payments%';

    • 只看 payments 相关的触发器。

    DROP TRIGGER IF EXISTS payments_after_insert;

    • 删触发器,IF EXISTS 防报错。

    3. 触发器审计

    DELIMITER $$

    CREATE TRIGGER payments_after_insert

    AFTER INSERT ON payments

    FOR EACH ROW

    BEGIN

    UPDATE invoices

    SET payment_total = payment_total + NEW.amount

    WHERE invoice_id = NEW.invoice_id;

    INSERT INTO payments_audit

    VALUES (NEW.client_id, NEW.date, NEW.amount, 'insert', NOW());

    END $$

    DELIMITER ;

    • 除了更新 invoices,还往 payments_audit 插一条记录,存谁(client_id)、啥时候(date)、多少钱(amount)、干了啥('insert')。

    INSERT INTO payments

    VALUES (DEFAULT, 5, 18, '2019-01-01', 888, 1);

    • 插 payments 数据,invoices 更新,payments_audit 加一行日志。

    4. 事件

    SHOW VARIABLES LIKE 'event%';

    • 查 event_scheduler 状态,没开就得开。

    SET GLOBAL event_scheduler = ON;

    • 开启事件调度。

    DELIMITER $$

    CREATE EVENT yearly_delete_stale_audit_rows

    ON SCHEDULE

    EVERY 2 DAY STARTS '2025-04-19' ENDS '2028-08-01'

    DO BEGIN

    DELETE FROM payments_audit

    WHERE action_date < NOW() - INTERVAL 1 YEAR;

    END $$

    DELIMITER ;

    • 每 2 天跑一次,从 2025-04-19 到 2028-08-01,删 payments_audit 里超 1 年的记录。
    • 也能用 AT '2025-04-19' 跑单次。

    SHOW EVENTS;

    SHOW EVENTS LIKE 'yearly%';

    • 列出事件,或筛选 yearly 开头的。

    DROP EVENT yearly_delete_stale_audit_rows;

    • 删事件。

    作业

    1. 删除触发器

    DELIMITER $$

    CREATE TRIGGER payments_after_delete

    AFTER DELETE ON payments

    FOR EACH ROW

    BEGIN

    UPDATE invoices

    SET payment_total = payment_total - OLD.amount

    WHERE invoice_id = OLD.invoice_id;

    END $$

    DELIMITER ;

    • 删除 payments 数据后,减去 invoices 的 payment_total,用 OLD 访问删除的数据。

    DELETE FROM payments

    WHERE payment_id = 9;

    • 删 payment_id = 9,触发器更新 invoices。

    总结

    讲了触发器,自动处理表改动,比如同步 invoices 或记日志到 payments_audit。还搞了事件,定时清老V3 删旧数据。用的 sql_invoicing 数据库。接下来看事务和索引。

相关推荐
kyriewen37 分钟前
白宫直接给 OpenAI 下了限制令,GPT-5.6 不能随便放出来了
前端·javascript·面试
掉头发的王富贵2 小时前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
PedroQue992 小时前
Vite插件v0.2.6:架构优化与自动化升级
前端·vite
Nturmoils2 小时前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
threerocks3 小时前
什么?我连 A2A、MCP 都没学会,现在又来了 AG-UI、A2UI.
前端·aigc·ai编程
牛奶4 小时前
如何自己写一个浏览器插件?
前端·chrome·浏览器
亿元程序员4 小时前
为什么Cocos都4.0了还有人用2.x?
前端
MomentYY4 小时前
AI 到底是“懂”,还是在“猜”?
前端·人工智能·ai编程
鹏毓网络科技4 小时前
Cursor Rules 文件配置实战:3 个隐藏参数让我每月少写 40% 样板代码
前端·github
没烦恼3014 小时前
无痕模式下 HTTP\-First 拦截引发的“页面刷新”误判
前端