SQL FK 和预检查是否存在

标签 sql foreign-keys

我想知道每个人对于在插入和更新之前预先检查外键查找与让数据库处理它有何看法。如您所知,如果相应的行不存在,服务器将抛出异常。

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

通过 SQL,我看到两个相反的点

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

2) 预检查允许开发人员向调用应用程序提出更多信息丰富的异常。可以为需要完成的每项检查返回不同的错误代码,而不是接收通用的“外键违规”。

你有什么想法?

最佳答案

之前不要测试:

  • 数据库引擎无论如何都会在 INSERT 上进行检查(您对索引进行了 2 次读取,而不是一次)
  • 如果没有锁提示或信号量,它就无法扩展,从而降低并发性和性能(第二个重叠并发调用可以在第一个调用执行 INSERT 之前传递 EXISTS)

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

这可以很好地扩展到大容量。

关于SQL FK 和预检查是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7068576/

相关文章:

c# - 在 ASP.NET 的一对多关系中,外键为 NULL。如何将其添加到 Controller 中?

java - sql查询检索与mysql和java的一个用户匹配的联系人记录的总和

sql - 在 SQL 中编写函数以循环访问 UDF 中的日期范围

sql - SELECT 有条件优先来源

mysql - 编号状态的条件聚合

Python SQLite3 - 表输出格式问题和处理 IntegrityError

php - 如何解决MySQL中的 "Cannot add or update a child row"?

sql-server - 级联删除链接表连接 2 个表,每个表都有一个级联删除到另一个表。如何?

mysql - 如何在插入行时更新外键?

java - JOOQ 的插入...与 PostgreSQL 10 和 JOOQ 3.10 一起返回?