You need to enable JavaScript to run this app. 如何编写MySQL TRIGGER:删除表1数据后同步更新或删除表2对应行
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MySQL TRIGGER:删除表1数据后同步更新或删除表2对应行

MySQL触发器实现代码

先约定表名和字段(你可以根据实际业务替换为自己的命名):

  • 表1(书籍信息表):books,对应字段:book_name(书籍名称)、publication(出版社)
  • 表2(出版社书籍数量统计表):publisher_stats,对应字段:publication(出版社)、book_count(书籍数量)

完整触发器代码

-- 先删除已存在的同名触发器,避免重复创建报错
DROP TRIGGER IF EXISTS after_book_delete;

-- 新建触发器
DELIMITER //
CREATE TRIGGER after_book_delete
AFTER DELETE ON books
FOR EACH ROW
BEGIN
    -- 声明变量存储当前出版社剩余书籍数量
    DECLARE remain_count INT DEFAULT 0;
    SELECT COUNT(*) INTO remain_count FROM books WHERE publication = OLD.publication;
    
    -- 根据剩余数量执行对应操作
    IF remain_count = 0 THEN
        -- 剩余书籍为0时删除表2对应出版社记录
        DELETE FROM publisher_stats WHERE publication = OLD.publication;
    ELSE
        -- 剩余书籍不为0时更新表2的数量值
        UPDATE publisher_stats SET book_count = remain_count WHERE publication = OLD.publication;
    END IF;
END //
DELIMITER ;

逻辑说明

  1. 触发器为AFTER DELETE类型,仅在表1的删除操作执行成功后触发
  2. OLD.publication代表被删除的书籍所属的出版社,每次删除一行就会触发一次逻辑执行,支持单次删除多条不同出版社书籍的场景
  3. 后置触发器统计剩余数量时已经排除了刚删除的书籍,统计结果和实际数据完全一致

示例验证

按照你给出的测试步骤执行:

  1. 执行DELETE FROM books WHERE book_name = '诗歌(Poem)':此时A出版社剩余1本小说,触发器会将表2中A的数量更新为1
  2. 再执行DELETE FROM books WHERE book_name = '数学(Math)':此时B出版社剩余0本书,触发器会删除表2中B对应的行
    最终表2结果和你给出的预期完全一致。

内容的提问来源于stack exchange,提问作者Saha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:15:04