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 数据库。接下来看事务和索引。

相关推荐
钛态33 分钟前
AI 辅助:前端框架反模式:过度封装、状态滥用与副作用失控
前端·vue·react·web
by__csdn36 分钟前
Vue vs React vs Angular:前端框架终极对决
前端·vue.js·react.js·前端框架·vue·react·angular
钛态38 分钟前
前端框架选型决策框架:React、Vue、Svelte、Solid 的 2026 年横评
前端·vue·react·web
2501_926102861 小时前
深入浅出Vue.js前端框架设计:核心原理与实践指南
前端·vue.js·前端框架
程序员黑豆2 小时前
使用AI编程开发鸿蒙应用:从环境搭建到实战示例
前端·harmonyos
程序员黑豆5 小时前
鸿蒙应用开发:一次开发多端部署之响应式布局完全指南
前端·harmonyos
小月土星6 小时前
2.0 React Router 前端路由深度解析:从传统后端路由到现代 SPA 的完整演进
前端
ltl7 小时前
大多数「无锁」代码其实不是无锁的
linux
ltl7 小时前
Linux 内核的内存屏障:一个让我调了三天的 bug
linux
long3168 小时前
MySQL 学习练习(配套 01 入门资料)
数据库·学习·mysql