我要删除供应商,但在此之前我想确保其他表中没有相关数据(例如订单等)。由于我在任何地方都有适当的外键约束,最简单的方法是在供应商表上执行delete语句并在处理程序中捕获错误,然后告诉用户删除是不可能的。
然而,仅仅为了兴趣,我想知道我是否可以在一个语句中检查依赖记录的存在,结果传递一个数字。到目前为止,我想出了
Const chkSQL As String = _
"SELECT COUNT(*) FROM bestellungen WHERE LiefID= @LiefID UNION " & _
"SELECT COUNT(*) FROM lieferungen WHERE LiefID= @LiefID UNION " & _
"SELECT COUNT(*) FROM lieferantenartikel WHERE LiefID= @LiefID"
但是这将提供3行各自的计数。如果我使用ExecuteScalar(我希望我得到3个值的总和),我似乎只得到最后一个表的结果。我已经尝试过SUM,但不知怎的,我无法正确使用语法。
有什么想法吗?
答案 0 :(得分:1)
如果你想要连续所有3个表的总和,那么;
select sum(cnt) as total_cnt
from (
SELECT COUNT(*) as cnt FROM bestellungen WHERE LiefID= @LiefID UNION all
SELECT COUNT(*) as cnt FROM lieferungen WHERE LiefID= @LiefID UNION all
SELECT COUNT(*) as cnt FROM lieferantenartikel WHERE LiefID= @LiefID
) x
此处使用union all
union
将从结果中排除类似的cnt
,这不是首选。
答案 1 :(得分:0)
如果您执行3个不同的选择,您将始终获得3个不同的结果!除非您解析并替换编程语言或其他内容的响应。尝试这样的事情,而不是:
Const chkSQL As String = _
"SELECT COUNT(*) FROM bestellungen WHERE LiefID= @LiefID UNION " & _
"SELECT COUNT(*) FROM lieferungen WHERE LiefID= @LiefID UNION " & _
"SELECT COUNT(*) FROM lieferantenartikel WHERE LiefID= @LiefID"
尝试使用这样的东西:
Const chkSQL As String =
"SELECT count(a.*), count(b.*), count(c.*) FROM bestellungen a, lieferungen b, lieferantenartikel c WHERE LiefID= a.@LiefID UNION and LiefID= b.@LiefID UNION and LiefID= a.@LiefID
答案 2 :(得分:0)
您可以在外键上设置ON DELETE RESTRICT
行为,而不是手动检查是否存在相关条目。
这样,当您尝试在父行上执行DELETE
时,如果存在引用该父行的值的子行,则查询将失败。如果父行没有引用子行,则可以删除该父行。
添加ON DELETE RESTRICT
的一种方法是创建表格:
CREATE TABLE child_table (
...
col_id INT,
FOREIGN KEY fk_col (col_id) REFERENCES parent_table (col_id) ON DELETE RESTRICT
) ENGINE=InnoDB;