确定具有数千条记录的多个表中的任何一个表中是否存在外键值

时间:2016-08-09 20:06:11

标签: sql sql-server sql-server-2008

当用户点击我的UI中的删除按钮删除产品时,我需要快速检查它是否是4个表中任何一个中的外键(Table1,Table2,Table3,Table4)。如果不是那么我可以继续删除。如果它只是一个,我就不能删除它。

其中一些表有数千条记录,我已经学会了使用连接的最佳方法,因为查询需要几分钟才能完成。

我认为联盟可能是最好的方式,但我想知道是否有办法可以进一步加强它。或者甚至可能发回它所涉及的表格,这样我就可以向用户提供一个描述性消息,告诉他们为什么不能删除产品。

这是我到目前为止所拥有的,它非常快,但当产品遍布整个地方时,会返回数千个1。我想我可以只做一个或默认,如果不是null,那么不要让它们删除。

select 1 
from (
    select ProductId from Table1
    union all
    select ProductId from Table2
    union all
    select ProductId from Table3
    union all
    select ProductId from Table4
) tbl
where ProductId = 1000

2 个答案:

答案 0 :(得分:1)

以下是使用existscase的方法:

select (case when exists (select 1 from table1 where productId = 1000) then 1
             when exists (select 1 from table2 where productId = 1000) then 1
             when exists (select 1 from table3 where productId = 1000) then 1
             when exists (select 1 from table4 where productId = 1000) then 1
             else 0
        end)

答案 1 :(得分:1)

一种方法是不在删除"上定义任何"创建外键时的子句。然后继续尝试删除记录。如果引用该记录的任何表中没有外键,则删除将成功,您可以正常进行业务。如果引用该记录的任何表中都有外键,则删除将失败。捕获错误并尝试向用户提供有意义的消息:"此客户无法删除,因为他们至少有一个订单仍未处理。"

通过这种方式,系统本身将为您执行检查,这肯定会比您在SQL级别执行的任何检查更有效。