如果有人在 2005 年向你描述一个 MySQL Bug,说它将困扰一个顶级开源数据库近 20 年,你可能会觉得夸张。但 Bug #11472 确实如此。

这个 Bug 的核心问题很具体:当父表上的外键级联操作(如 ON DELETE SET NULL 或 ON UPDATE CASCADE)导致子表行被间接更新或删除时,子表上的触发器不会执行。 Bug 提交者 Omer Barnir 在 2005 年就提供了清晰的复现步骤:建立两张 InnoDB 表 t1 和 t2,t2 上有一个 AFTER UPDATE 触发器,当 DELETE FROM t1 时,t2 的 f_id 被级联设为 NULL——但 t2 上的触发器计数器始终为 0,说明触发器从未被激活。而直接 UPDATE t2 时,触发器是正常工作的。
问题很快被 MySQL 创始人 Heikki Tuuri 确认为已知问题。2005 年 6 月,开发者 Dmitry Lenev 表示将在 5.1 版本修复。然而事与愿违,由于涉及架构层面的复杂性——需要在 MySQL 的 InnoDB 外键实现与触发器执行机制之间建立新的协调路径——这一问题被一拖再拖。2013 年,Ståle Deraas 公开表示"这是一个需要重大开发工作的问题,不是一个简单的 Bug 修复"。
这一拖就是将近 20 年。在此期间,无数开发者在评论区留下了带有苦涩幽默的痕迹:
[2005年6月30日 19:04] 我们将在5.1版本中修复此问题。
[2007年2月21日 12:56] MySQL 自身的 FOREIGN KEY 实现最终会解决这个问题,但这仍然需要一些时间。
[2007年6月4日 20:00] 截至 5.1.11 版本,此问题仍然存在。
[2009年7月2日 15:42] 此错误不会在 5.1 版本中修复。
[2011年3月13日 14:37] 5年过去了,这个漏洞仍然没有被修复。
[2013年5月8日 12:29] 快8年了……有什么进展吗?
[2013年5月8日 13:25] Oracle 的那些家伙可能收不到这些消息,因为他们的触发器没触发 ;)
[2013年5月8日 13:52] 请注意,修复此问题需要大量的开发工作,并非简单的错误修复。
[2015年6月21日 8:38] 周年快乐!已经10年了……
[2015年6月24日 21:42] 这个缺陷秋季就要上中学了。
[2018年6月21日 18:02] 11472,13岁生日快乐!他们长得真快啊 :')
[2019年11月11日 9:12] 很想知道提交错误报告的那位老兄现在怎么样了。他还活着吗?他还在用MySQL吗?
[2019年11月12日 14:29] 谢谢关心。我一切都好,而且正在使用MySQL。
[2020年6月11日 21:36] 这个bug比我年纪还大。
[2020年7月15日 12:28] 各位,我女朋友说等这个bug解决了她就嫁给我。请问这方面有什么进展吗?PS:我们从2017年就开始等了,她现在都考虑嫁给Gary了。PS 2:Gary你真是个混蛋!
[2021年1月18日 0:49] 只是想看看我们最喜欢的bug是否挺过了新冠疫情。很高兴看到它一切安好。
2025 年 3 月 17 日,MySQL 开发者 Prabakaran Thirumalai 在评论区别处宣布:Bugs #11472 已作为 Worklog WL#17024"Activate triggers on referencing tables during foreign key CASCADE"的一部分被修复。
这条迟来的公告在评论区引发了热烈回应——有人感叹"真的假的?那以后我们每年庆祝 Bug 生日的活动怎么办?"Omer Barnir 本人也在评论区幽默回复:"蛋糕仍然欢迎。"
对于 MySQL 社区而言,这是一个标志性时刻。这个 Bug 记录了 MySQL 从 5.0 到 8.0 的完整生命周期,也见证了无数开发者因这个未修复问题而转向 PostgreSQL 等竞品的整个过程。WL#17024 的完成,意味着 MySQL 在 ACID 合规性上补上了重要的一环。
参考来源:https://bugs.mysql.com/bug.php?id=11472