SQL FK和预先检查存在

时间:2011-08-15 17:53:15

标签: sql foreign-keys

我想知道每个人对于在INSERTS和UPDATES之前预先检查外键查找而不是让数据库处理它的意见是什么。如您所知,如果相应的行不存在,服务器将抛出异常。

在.NET中,我们总是试图避免异常编码,即不使用引发的异常来驱动代码流。这意味着我们尝试在运行时之前检测潜在的错误。

使用SQL我看到两个相反的点

1)无论你是否检查数据库。这意味着您可能会浪费(多少是主观的)CPU周期进行两次相同的检查。这使得人们倾向于让数据库只做它。

2)预检查允许开发人员将更多信息性异常提交回调用应用程序。可以为每个需要完成的检查返回不同的错误代码,而不是接收通用的“外键冲突”。

你有什么想法?

3 个答案:

答案 0 :(得分:2)

数据完整性维护是数据库的工作,所以我想让你让数据库处理它。在这种情况下引发的异常是一个有效的情况,即使可以避免,它也是一个正确引发的异常,因为它意味着代码中的某些东西不能正常工作,它正在发送一个孤立的记录用于插入(或者某些东西)第一次插入失败 - 无论你插入它的方式如何)。此外,你应该尝试/捕获,所以你可以实现一个有意义的方法来处理这个......

答案 1 :(得分:2)

之前不要测试:

  • 数据库引擎无论如何都会检查INSERT(你有2个索引读取,而不是一个)
  • 如果没有锁定提示或信号量会降低并发性和性能,它将无法扩展(第二次重叠的并发调用可以在第一次调用INSERT之前通过EXISTS)

你可以做的是将INSERT包装在拥有 TRY / CATCH中并忽略错误xxxx(外键违规,抱歉不知道)。我之前提到过(对于唯一键,错误2627)

这非常适合高容量。

答案 2 :(得分:1)

我没有看到预先检查FK违规的好处。

如果您需要更多信息性错误语句,可以简单地将插入包装在try-catch块中,并在此时返回自定义错误消息。这样,你只会在失败时而不是每次都运行额外的查询。