我想首先说我是使用外键的忠实粉丝,并且即使在小型项目上也倾向于使用它们来防止我的数据库被孤立的数据填充。在较大的项目中,我最终得到了大量的密钥,最终覆盖了8到10层数据。
我想知道是否有人可以建议一种优雅的方式来处理来自MySQL数据库的“预期错误”,以便我可以为最终用户构建有意义的消息。我将用一个例子解释'预期错误'。
假设我有一组用于基本讨论的表格:
discussion
questions
responses
users
从层次结构来看,它们可能看起来像这样:
-users
--discussion
---questions
----responses
当我尝试删除用户时,FK将检查讨论,如果存在任何讨论,则删除受限制,删除讨论检查问题,删除问题检查响应。在这种情况下,“预期错误”将尝试删除用户 - 除非他们是新创建的,否则我可以预期一个或多个外键将导致错误。
我想要做的是在删除时捕获该错误并且能够告诉最终用户类似“我们很抱歉”,但必须删除所有讨论才能删除此用户...'。
现在我知道我可以在PHP中保留和维护匹配的数组并将特定的错误映射到消息但是这很麻烦并且容易变得停滞不前,或者我可以在尝试删除之前手动运行一组选择,但后来我在不使用FK的情况下做同样多的工作。
非常感谢任何帮助,或者如果我只是看着这个完全错误,请告诉我。
另一方面,我通常使用CodeIgniter进行应用程序开发,因此,如果这样可以通过该框架打开一条途径,请在答案中考虑这一点。
先谢谢
答案 0 :(得分:2)
可悲的是,MySQL没有像SQL Server或Oracle那样公开定义自定义错误的能力。
选中blog post about using a UDF to be able to define custom errors。
答案 1 :(得分:0)
听起来您需要使用ON DELETE CASCADE
定义外键。这将删除其他表中的任何引用数据。
答案 2 :(得分:0)
您不应该依赖数据库来为应用程序代码创建错误。当您的应用程序代码混乱并尝试删除不应该删除的内容时,FK就会出现。
如果您真的想给用户一个很好的错误消息,您必须先运行选择,然后构建相应的错误消息。
修改
您可以在一个选择中检查外键。如果你正在使用类似于教条的ORM,你甚至不必指定连接,只需告诉它要选择哪些字段,然后检查每个表是否存在非零行。