我一直在使用以下模式来验证执行 INSERT 的存储过程的 FOREIGN KEY (FK) 参数:
CREATE PROC spCreateChildFoo
@ForeignKey_Id int,
@Attribute varchar(50)
AS
IF NOT EXISTS (SELECT ForeignKey_Id FROM ForeignTable WHERE ForeignKey_Id = @ForeignKey_Id)
BEGIN
RAISERROR ('The input ForeignKey_Id does not exist', 16, 1)
RETURN;
END
INSERT INTO ChildTable (ForeignKey_Id, Attribute)
VALUES (@ForeignKey_Id, @Attribute)
我这样做是因为我想在插入任何数据之前在执行存储过程的早期捕获错误的 FK 条目,尤其是对于执行多个 INSERT 的过程。我还认为这是返回准确错误消息以简化调试的好方法。这种模式可以很好地服务于这两个目标。
问题
这是在浪费时间吗?
更具体地说,我是否应该仅依靠 FK 约束来验证 FK 参数并在失败时回滚?
随着数据库的增长,它最终会损害我的应用程序的性能吗?