当用户点击我的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
答案 0 :(得分:1)
以下是使用exists
和case
的方法:
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级别执行的任何检查更有效。