2015-08-24 36 views
0

我將刪除一個供應商,但在此之前,我想確保其他表中沒有依賴數據(例如訂單等)。由於我在任何地方都有適當的外鍵約束,所以最簡單的方法可能是在供應商表上執行delete語句並捕獲處理程序中的錯誤,然後告訴用戶刪除操作不可行。MySql查找一條語句中是否存在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" 

但是,這將提供3行與各自的計數。如果我使用ExecuteScalar(我希望我會得到3個值的總和),我似乎只得到最後一個表的結果。我已經嘗試過SUM,但不知何故我無法獲得正確的語法。

任何想法?

+0

對不起,標題我有一個錯字:3 insted的2 ... –

+0

'''常量chkSQL作爲String'''似乎對我來說不是MySQL-SQL方言。這是哪種編程語言?此外,自己改變標題(提示:編輯你自己的帖子) – luksch

回答

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

+0

偉大的是它!完美的作品。非常感謝Praveen,我又學到了一些重要的東西。我只需要一些時間就可以理解它::-)(例如,在聲明結尾處做了些什麼?) –

+0

這是子查詢別名。像'as x' – Praveen

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= [email protected] UNION and LiefID= [email protected] UNION and LiefID= [email protected] 
+0

對不起,您的陳述會產生語法錯誤... –

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; 
+0

@Jahn Bupit:乾杯,約翰。我已經說過,因爲我有適當的FK限制,這將是最簡單的方法,實際上我已經這樣寫了。我的問題是對SQL有純粹的興趣,不管是否有某種語法允許我嘗試。 –

+0

@luksch:語言是VB.Net,並且將SQL語句作爲字符串常量在中心位置處進行聲明是一種很好的編程習慣。當數據庫發生變化時,使維護更容易,至少對我而言... –

相關問題