2009-06-22 970 views
2

我想知道基於java中sql的唯一索引來捕獲異常是否是個好主意。在java中用作異常處理方法的mysql唯一索引

我想抓住一個異常,如'重複條目爲1-0'如果是的話處理異常,否則在數據庫表中正確插入?

+0

因此,您正試圖在唯一列上發出插入操作,而不檢查值是否已經存在,以及何時出現異常,您將知道存在重複項。這是正確的嗎 ? – Babar 2009-06-22 07:19:05

+0

是的。我想檢查的不僅僅是 – 2009-06-22 08:06:49

回答

2

我說你不這樣做,有兩個原因:

  • 錯誤消息是有點不清楚:ERROR 1062(23000):重複項 'XXX' 爲重點1。你總是100%確定哪個鍵是1?
  • 它在你鎖定到特定的數據庫供應商

我覺得很簡單事務

  • 檢查行的存在;
  • 如果該行已經存在,則會引發異常;
  • 插入新行。

性能問題

我說要測量兩次,切割一次。剖析特定用例的用法。我想說的是,除了沉重的數據庫使用情況之外,性能不會成爲問題。

的原因是,一旦你在那個特定行執行SELECT,其數據將被放在數據庫高速緩存和用於在爲INSERT語句對索引進行插入檢查立即。同時請記住,這種訪問是由索引支持導致的結論是,性能不會成爲問題。

但是,一如既往,做措施。

1

我不明白爲什麼不。這可能比插入之前運行查詢更有效。不過,抓住異常的錯誤代碼而不是識別錯誤信息可能會更好。

+0

另外,如果您碰巧使用Spring,那麼JDBC xception翻譯器會將SQLException轉換爲DataIntegrityViolationException。這可能更好,而不是原始的例外。 – skaffman 2009-06-22 07:33:00

1

您可以使用REPLACE命令。它根據記錄的存在插入/更新。而它的原子也是查詢然後插入/更新不是。這取決於如果您檢測到違規行爲,您想要做什麼?