如何编写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 ;
逻辑说明
- 触发器为
AFTER DELETE类型,仅在表1的删除操作执行成功后触发 OLD.publication代表被删除的书籍所属的出版社,每次删除一行就会触发一次逻辑执行,支持单次删除多条不同出版社书籍的场景- 后置触发器统计剩余数量时已经排除了刚删除的书籍,统计结果和实际数据完全一致
示例验证
按照你给出的测试步骤执行:
- 执行
DELETE FROM books WHERE book_name = '诗歌(Poem)':此时A出版社剩余1本小说,触发器会将表2中A的数量更新为1 - 再执行
DELETE FROM books WHERE book_name = '数学(Math)':此时B出版社剩余0本书,触发器会删除表2中B对应的行
最终表2结果和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者Saha
相关产品推荐
相关产品推荐

