我想知道每个人对于在插入和更新之前预先检查外键查找与让数据库处理它有何看法。如您所知,如果相应的行不存在,服务器将抛出异常。
在 .NET 中,我们总是尝试避免异常编码,即不使用引发的异常来驱动代码流。这意味着我们尝试在运行时之前检测到潜在的错误。
通过 SQL,我看到两个相反的点
1)无论你是否检查数据库总是会的。这意味着您可能会浪费(多少是主观的)CPU 周期来执行相同的检查两次。这使得人们倾向于只让数据库来做这件事。
2) 预检查允许开发人员向调用应用程序提出更多信息丰富的异常。可以为需要完成的每项检查返回不同的错误代码,而不是接收通用的“外键违规”。
你有什么想法?
最佳答案
之前不要测试:
- 数据库引擎无论如何都会在 INSERT 上进行检查(您对索引进行了 2 次读取,而不是一次)
- 如果没有锁提示或信号量,它就无法扩展,从而降低并发性和性能(第二个重叠并发调用可以在第一个调用执行 INSERT 之前传递 EXISTS)
您可以做的是将 INSERT 包装在它自己的 TRY/CATCH 中并忽略错误 xxxx(外键违规,抱歉不知道)。我之前已经提到过这一点(对于唯一键,错误 2627)
- Only inserting a row if it's not already there
- Select / Insert version of an Upsert: is there a design pattern for high concurrency?
- SQL Server 2008: INSERT if not exits, maintain unique column
这可以很好地扩展到大容量。
关于SQL FK 和预检查是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7068576/