2014-04-19 327 views
0

我应该检查外键是否存在sql请求,或者我应该尝试插入并捕获它是否失败?检查记录是否存在外键

我可以检查我引用的键是否存在。

我的问题更多的是一个理论:捕获一个异常与查询db每一次插入一次。

例如说你有两张桌子,猫和人。猫有一个引用Human的外键。在我尝试插入猫之前,我应该检查是否存在具有给定猫所有者列的人,或者我应该尝试盲目地插入并在失败时捕获。

+0

您可以编辑问题以提供有关您所面临问题的更多详细信息,即:是否您无法控制要检查外键的外部数据库?数据库模式/实体模型的外观如何?为什么当你试图插入新记录时失败(fk通常会阻止更新/删除现有记录,除非你试图插入不存在的依赖项) –

+0

我已经更新了这个问题(= – interlude

回答

2

这不是一个简单的答案,它确实取决于您的应用程序要求。

尽管作为一般的经验法则,您应该避免将异常作为正常应用程序流的一部分抛出,并且在使用异常时会遇到一些问题。

  • 首先接收SQL异常时,你需要确定异常的来源,这可能是复杂的和数据库特定的(在这里看到的细节:How to catch a specific exception in JDBC?

  • 其次,即使你设法限制您的例外代码为参考完整性如果Cat参考Human及其最爱Food,您仍将面临识别问题来源的任务。此外,即使您设法确定错误的来源是缺少参照完整性,也可能有几个原因(而不是简单地插入新行,您需要进一步调查)。想象一下,当你试图这样做时,你想插入一只猫为'多萝西史密斯',而多萝西结婚了(可能这只猫是来自恶毒的婆婆的婚礼礼物),并改变了她的名字到'多萝西格里菲斯'。所以现在当你试图插入猫,如果你只是盲目地插入一个新的记录,你会在你的数据库中复制多萝西。

  • 此外,由于上述原因,对外键使用人工创建的id(而不是一组唯一标识用户的字段)是有意义的。在这种情况下,你需要首先获得这个内部id(如果你不想让应用程序知道标识符,存储过程和使用ORM框架如Hibernate成为最常见的)。

话虽如此,我仍然可以想象的情况下处理异常情况将有它的好处,主要是当你需要解决一个特定的性能要求。这种情况的例子可以是交易系统,您可以获得货币和快速交易汇率。由于它很少发生新的货币引入,所以它可以被看作是一种特殊情况,并且检查它是否存在是没有意义的(尽管在一个正确设计的系统中,这只会让你免于调用哈希函数用于检查货币是否存在,因为肯定是在内部缓存所有货币,实际上可能比用try ... catch ...块包装db呼叫更快)。

因此,总之,尽量不要使用异常,但要正确定义应用程序逻辑,并且在真正需要时回退使用异常。

+0

我没有理解为什么多萝西会被复制。 – interlude