2011-11-16 31 views
0

在一個程序中,我們應該使用try catch來檢查表中重複值的插入,還是應該檢查表中是否存在該值,並避免插入?如何處理數據庫中的重複項?

+0

在現實世界中,您經常需要預先驗證事物像這樣在你的應用程序擊中數據庫之前。例如,如果你有一個Web UI,你可能需要做簡單的表單驗證。 – seand

+0

例外有性能損失。嘗試和避免例外通常更高效。只有發生異常時,您纔會在聲明try catch塊時承擔任何費用。如果您的程序正在執行大量插入,則使用異常捕獲時性能可能會成爲問題。 –

回答

2

這很容易在數據庫端實施UNIQUE約束,這是我的建議。我嘗試將盡可能多的數據完整性放入數據庫,這樣我就可以避免出現錯誤的數據(儘管有時不可避免)。

如果這就是你已經擁有它的方法,那麼你可能只需要捕獲mysql異常,以便在檢查這樣的表時重複插入值,然後插入代價更高,然後讓數據庫執行一次簡單的查找(並且可能插入物)。

0

您可以添加UNIQUE約束你的表..喜歡的東西

CREATE TABLE IF NOT EXISTS login 
(
    loginid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    loginname CHAR(20) NOT NULL, 
    UNIQUE (loginname) 
); 

這將確保不會有兩個登錄名是相同的。

0

,你可以創建一個獨特的複合鍵

ALTER TABLE `TableName` ADD UNIQUE KEY (KeyOne, KeyTwo, ...); 
0

你只需要建立在你的表中的唯一鍵,以便將不允許再次添加相同的值。

0

您應該嘗試插入值並捕獲異常。在繁忙的系統中,如果您檢查值的存在性,它可能會在您檢查的時間和插入時間之間插入。

讓數據庫做它的工作,讓數據庫檢查重複條目。

-1

我認爲最好檢查一下值是否已經存在並避免插入。檢查重複值可以在保存數據的過程中完成(如果數據庫是SQL數據庫,則使用存在)。

如果存在重複項,您可以避免插入,並可以將值返回給您的應用程序,以指示如此,然後相應地顯示消息。

例如,一塊SQL代碼可能是這樣的:

select @ret_val = 0 
    If exists (select * from employee where last_name = @param_ln and first_name = @param_fn) 
     select @ret_val = -1 
    Else 
     -- your insert statement here 

    Select @ret_val 

你的條件重複的值取決於你定義爲一個重複的記錄。在您的應用程序中,您將使用返回值來了解數據是否重複。祝你好運!

1

取決於您是插入一個還是一百萬個,以及重複是否是主鍵。

如果它的主鍵,閱讀:http://database-programmer.blogspot.com/2009/06/approaches-to-upsert.html

的UPSERT或對重複KEY ...的UPSERT背後的想法很簡單。 客戶端發出INSERT命令。如果一行已經存在 給定的主鍵,那麼 將取代非鍵值並更新該行,而不是拋出鍵違例錯誤。

這是奇怪的(也是非常不尋常的)情況之一,其中MySQL 實際上支持在其他所有其他更多 成熟數據庫中找不到的東西。所以如果你使用的是MySQL,你不需要做任何特別的事情來製作UPSERT。你剛纔術語「ON DUPLICATE KEY UPDATE」添加到INSERT語句:

如果它不是主鍵,你將只有一行,那麼你仍然可以確保這不會導致失敗。

對於您的實際問題,我並不喜歡使用try/catch作爲程序流的想法,但實際上,您必須評估可讀性和用戶體驗(在這種情況下的性能),並選擇您認爲的兩者的最佳組合。

0

數據庫是一組業務規則的計算機化表示,DBMS用於強制執行這些業務規則作爲約束。既不能驗證數據庫中的命題在現實世界中是否屬實。例如,如果所討論的模型是企業的員工,並且表中包含名爲'Jimmy Barnes'的DBMS(也不是數據庫)的兩個人無法知道其是否是重複的,無論是否是真實的人等等。受信任的來源是需要確定存在和身份。在上面的例子中,企業的人事部門負責檢查公共記錄,仔細閱讀參考資料,確保該人員不在工資單上等,然後分配一個可用作關鍵字的唯一員工參考編號。這就是我們尋找具有可信來源的行業標準標識符的原因:書籍的ISBN,汽車的VIN,ISO 4217的貨幣,ISO 3166的國家等。