2011-08-15 33 views
2

我想知道在插入和更新與讓數據庫處理它之前預先檢查外鍵查找有什麼大家的看法。如你所知,如果相應的行不存在,服務器將拋出異常。SQL FK和存在的預先檢查

在.NET中,我們總是試圖避免異常編碼,因爲它沒有使用引發的異常來驅動代碼流。這意味着我們試圖在運行時間之前檢測潛在的錯誤。

隨着SQL我看到兩個相對點

1)無論您是否選中與否數據庫總是會。這意味着你可能會浪費(多少是主觀的)CPU週期進行兩次相同的檢查。這使得一個傾向於讓數據庫只做它。

2)預檢查允許開發者將更多的信息異常提交給調用應用程序。而不是接收通用的「外鍵違規」,可以爲每個需要完成的檢查返回不同的錯誤代碼。

你的想法是什麼?

+1

在數據庫世界中,你很少關心CPU。這是關於內存和磁盤IO,所以雙重檢查FK的存在可能會導致雙重磁盤讀取(取決於服務器負載以及在插入之前是否換出頁面) – billinkc

回答

2

不要測試前:

  • 數據庫引擎將反正檢查INSERT(你有2索引的讀取,而不是一個)
  • 它不會無鎖提示或減少併發性和性能信號量比例(一個第二重疊併發呼叫可以傳遞EXISTS第一呼叫確實一個INSERT之前)

你可以做的是把INSERT放入它的自己 TRY/CATCH並忽略錯誤xxxx(外鍵違規,對不起不知道)。我之前(獨特的按鍵,錯誤2627)

該做的非常良好,高容量已經提到了這一點。

+0

其他發佈的答案與此類似,但gbn提供了其他鏈接。 – Jason

1

我沒有看到預先檢查FK違規的好處。

如果您需要更多的信息性錯誤語句,您可以簡單地將您的插入包裝在try-catch塊中,並返回此時的自定義錯誤消息。這樣你只能在失敗而不是每次都運行額外的查詢。

2

數據完整性維護是數據庫的工作,所以我會說你讓DB處理它。在這種情況下引發的異常是一種有效的情況,儘管可以避免,但它是一個正確引發的異常,因爲它意味着代碼中的某些內容不能正常工作,它發送的是插入的孤立記錄(或某些東西在第一次插入失敗 - 無論你插入它的方式)。此外,你應該有try/catch語句,所以你可以實現處理這種有意義的方式...