2014-04-19 330 views
0

我應該檢查外鍵是否存在sql請求,或者我應該嘗試插入並捕獲它是否失敗?檢查記錄是否存在外鍵

我可以檢查我引用的鍵是否存在。

我的問題更多的是一個理論:捕獲一個異常與查詢db每一次插入一次。

例如說你有兩張桌子,貓和人。貓有一個引用Human的外鍵。在我嘗試插入貓之前,我應該檢查是否存在具有給定貓所有者列的人,或者我應該嘗試盲目地插入並在失敗時捕獲。

+0

您可以編輯問題以提供有關您所面臨問題的更多詳細信息,即:是否您無法控制要檢查外鍵的外部數據庫?數據庫模式/實體模型的外觀如何?爲什麼當你試圖插入新記錄時失敗(fk通常會阻止更新/刪除現有記錄,除非你試圖插入不存在的依賴項) –

+0

我已經更新了這個問題(= – interlude

回答

2

這不是一個簡單的答案,它確實取決於您的應用程序要求。

儘管作爲一般的經驗法則,您應該避免將異常作爲正常應用程序流的一部分拋出,並且在使用異常時會遇到一些問題。

  • 首先接收SQL異常時,你需要確定異常的來源,這可能是複雜的和數據庫特定的(在這裏看到的細節:How to catch a specific exception in JDBC?

  • 其次,即使你設法限制您的例外代碼爲參考完整性如果Cat參考Human及其最愛Food,您仍將面臨識別問題來源的任務。此外,即使您設法確定錯誤的來源是缺少參照完整性,也可能有幾個原因(而不是簡單地插入新行,您需要進一步調查)。想象一下,當你試圖這樣做時,你想插入一隻貓爲'多蘿西史密斯',而多蘿西結婚了(可能這隻貓是來自惡毒的婆婆的婚禮禮物),並改變了她的名字到'多蘿西格里菲斯'。所以現在當你試圖插入貓,如果你只是盲目地插入一個新的記錄,你會在你的數據庫中複製多蘿西。

  • 此外,由於上述原因,對外鍵使用人工創建的id(而不是一組唯一標識用戶的字段)是有意義的。在這種情況下,你需要首先獲得這個內部id(如果你不想讓應用程序知道標識符,存儲過程和使用ORM框架如Hibernate成爲最常見的)。

話雖如此,我仍然可以想象的情況下處理異常情況將有它的好處,主要是當你需要解決一個特定的性能要求。這種情況的例子可以是交易系統,您可以獲得貨幣和快速交易匯率。由於它很少發生新的貨幣引入,所以它可以被看作是一種特殊情況,並且檢查它是否存在是沒有意義的(儘管在一個正確設計的系統中,這隻會讓你免於調用哈希函數用於檢查貨幣是否存在,因爲肯定是在內部緩存所有貨幣,實際上可能比用try ... catch ...塊包裝db呼叫更快)。

因此,總之,儘量不要使用異常,但要正確定義應用程序邏輯,並且在真正需要時回退使用異常。

+0

我沒有理解爲什麼多蘿西會被複制。 – interlude