我可以使用外键限制返回PHP中有意义的UI错误吗

我可以使用外键限制返回PHP中有意义的UI错误吗,php,mysql,error-handling,foreign-keys,Php,Mysql,Error Handling,Foreign Keys,首先,我想说,我非常喜欢使用外键,甚至在小项目中也会使用外键,以避免数据库中充满孤立数据。在更大的项目中,我最终得到了大量的密钥,这些密钥覆盖了8-10层以上的数据 我想知道是否有人能提出一种优雅的方法来处理MySQL数据库中的“预期错误”,我可以为最终用户构造有意义的消息。我将用一个例子解释“预期错误” 假设我有一组用于基本讨论的表格: discussion questions responses users 从层次上看,它们可能看起来像这样: -users --discussion ---

首先,我想说,我非常喜欢使用外键,甚至在小项目中也会使用外键,以避免数据库中充满孤立数据。在更大的项目中,我最终得到了大量的密钥,这些密钥覆盖了8-10层以上的数据

我想知道是否有人能提出一种优雅的方法来处理MySQL数据库中的“预期错误”,我可以为最终用户构造有意义的消息。我将用一个例子解释“预期错误”

假设我有一组用于基本讨论的表格:

discussion
questions
responses
users
从层次上看,它们可能看起来像这样:

-users
--discussion
---questions
----responses
当我尝试删除用户时,FKs将检查讨论,如果存在任何讨论,则删除将受到限制,删除讨论将检查问题,删除问题将检查回答。在这种情况下,一个“预期错误”是试图删除一个用户——除非他们是新创建的,否则我可以预期一个或多个外键将失败,从而导致错误

我想做的是捕获删除时的错误,并能够告诉最终用户类似“很抱歉,但在删除此用户之前必须删除所有讨论…”

现在我知道我可以在PHP中保留和维护匹配的数组,并将特定的错误映射到消息,但这很混乱,而且容易停滞,或者我可以在尝试删除之前手动运行一组SELECT,但我所做的工作与不使用FKs时一样多

这里的任何帮助都将不胜感激,或者如果我只是认为这是完全错误的,那么请让我知道

在一个旁注中,我通常使用CODEGITER用于我的应用程序开发,因此如果这将打开一个通过该框架的途径,请在您的答案中考虑。< /P>


提前感谢

听起来您需要在删除级联时使用
定义外键
。这将删除其他表中的所有引用数据。

您不应该依赖数据库为应用程序代码创建错误。当你的应用程序代码出错并试图删除一些它不应该删除的东西时,FK就会出现

如果您真的想给用户一个好的错误消息,那么您必须首先运行selects,并生成相应的错误消息

编辑


您可以在一次选择中检查外键。如果您使用的是类似ORM的原则,您甚至不必指定联接,只需告诉它要选择哪些字段,然后检查每个表中的非零行。

遗憾的是,MySQL没有像SQL Server或Oracle那样公开定义自定义错误的能力

  • 规范是v5.5的行为
变通办法

检查此项。

在本例中,我不希望数据级联——我的示例相当空洞,因为我希望保持简单,但在某些情况下,我希望它失败,但我需要让用户知道原因。谢谢你!我同意FKs可以作为应用程序的安全网,但我不认为这是它们的唯一用途——我阅读您的文章时,您不会使用FKs级联删除数据以删除孤立项,而是在代码中手动执行?我认为FK可以用来自动化我们在代码中所做的大量数据处理,因为我无论如何都在这样做,所以我只想从代码的角度来构建它。我来看看原则,看看它是如何工作的——我从未见过有人通过select“ping”an FK,这将非常方便。这些是一些非常有趣的链接,谢谢!如果我读对了,看起来5.5将包括SPs的信号和RESIGNAL,但可能无法从一般删除失败中调用它们。如此接近,却如此遥远。这将再次迫使我在触发器或SP中重新写入所有FK规则,而不是使用现有功能。不过还是很好的信息@Shane:顺便说一句,Postgres确实有能力捕捉错误:不敲MySQL(我几乎每天都在使用它),但这是10年来我第一次真正“感觉”到缺少什么。没什么大不了的,但有点痛苦@Shane:十年不多了,但如果这是MySQL的第一个缺点的话,你还没有考虑过使用分析函数、CTE支持和视图。从各个方面来说,你都是对的——大多数都没有找到需求,尽管我试过视图,但找不到一个好的使用案例(可能是因为我当时不知道他们有什么潜在问题)。