sql - 存储过程最佳实践?他们应该在插入之前检查外键是否存在吗?

标签 sql sql-server stored-procedures

当构建一个插入简单链接表的存储过程时,应该检查 FK 是否存在并优雅地返回错误,还是只是让 SQL 抛出异常?

  • 最佳实践是什么?
  • 什么最有效?

以防万一有人不明白我的问题:

  • 表 A
  • 表 B
  • 表AB

我应该这样做:

IF EXISTS(SELECT 1 FROM A WHERE Id = @A) AND EXISTS(SELECT 1 FROM B WHERE Id = @B)
BEGIN
      INSERT AB (AId,BId) VALUES (@A,  @B)
END
ELSE
   --handle gracefully, return error code or something

INSERT AB (AId,BId) VALUES (@A, @B)

并让 SQL 抛出异常

谢谢

最佳答案

如果表在您的控制之下,则没有理由执行额外的检查。只需假设它们设置正确,然后让 SQL 处理任何错误。不断检查您是否确实完成了您想要做的事情是过度防御性编程,会给您的代码增加不必要的复杂性。

例如,您不会编写如下代码:

i = 1;

if (i != 1) 
{
    print "Error: i is not 1!";
}

我认为这种情况类似。

如果表不受您的控制,则优雅地处理错误可能会很有用。例如,如果此过程可以在用户创建的任意一组表上运行,或者如果它将分发给需要在自己的数据库中设置表的外部用户,您可能需要添加一些自定义错误处理。这样做的目的是让用户更清楚地描述出了什么问题。

关于sql - 存储过程最佳实践?他们应该在插入之前检查外键是否存在吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36593677/

相关文章:

MySQL GROUP BY 按天查询分组结果

SQL Server : how to know if any row is referencing the row to delete

sql-server - 在 SQL Server 2005 中使用 CTE 进行递归查询

Java 连接到 SQL Server

azure - 在 Azure 逻辑应用中执行存储过程 - 错误网关错误

sql - mariadb json中json_table的正确使用

php - 计算项目并获得百分比

c# - Entity Framework 3.5 动态创建实体

c# - 从 LINQ ExecuteMethodCall 中提取 SQL 'print' 消息

sql - SP :CacheHit Event in SQL Profiler 的说明