在一個程序中,我們應該使用try catch來檢查表中重複值的插入,還是應該檢查表中是否存在該值,並避免插入?如何處理數據庫中的重複項?
回答
這很容易在數據庫端實施UNIQUE約束,這是我的建議。我嘗試將盡可能多的數據完整性放入數據庫,這樣我就可以避免出現錯誤的數據(儘管有時不可避免)。
如果這就是你已經擁有它的方法,那麼你可能只需要捕獲mysql異常,以便在檢查這樣的表時重複插入值,然後插入代價更高,然後讓數據庫執行一次簡單的查找(並且可能插入物)。
您可以添加UNIQUE約束你的表..喜歡的東西
CREATE TABLE IF NOT EXISTS login
(
loginid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
loginname CHAR(20) NOT NULL,
UNIQUE (loginname)
);
這將確保不會有兩個登錄名是相同的。
,你可以創建一個獨特的複合鍵
ALTER TABLE `TableName` ADD UNIQUE KEY (KeyOne, KeyTwo, ...);
你只需要建立在你的表中的唯一鍵,以便將不允許再次添加相同的值。
您應該嘗試插入值並捕獲異常。在繁忙的系統中,如果您檢查值的存在性,它可能會在您檢查的時間和插入時間之間插入。
讓數據庫做它的工作,讓數據庫檢查重複條目。
我認爲最好檢查一下值是否已經存在並避免插入。檢查重複值可以在保存數據的過程中完成(如果數據庫是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
你的條件重複的值取決於你定義爲一個重複的記錄。在您的應用程序中,您將使用返回值來了解數據是否重複。祝你好運!
取決於您是插入一個還是一百萬個,以及重複是否是主鍵。
如果它的主鍵,閱讀: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作爲程序流的想法,但實際上,您必須評估可讀性和用戶體驗(在這種情況下的性能),並選擇您認爲的兩者的最佳組合。
數據庫是一組業務規則的計算機化表示,DBMS用於強制執行這些業務規則作爲約束。既不能驗證數據庫中的命題在現實世界中是否屬實。例如,如果所討論的模型是企業的員工,並且表中包含名爲'Jimmy Barnes'的DBMS(也不是數據庫)的兩個人無法知道其是否是重複的,無論是否是真實的人等等。受信任的來源是需要確定存在和身份。在上面的例子中,企業的人事部門負責檢查公共記錄,仔細閱讀參考資料,確保該人員不在工資單上等,然後分配一個可用作關鍵字的唯一員工參考編號。這就是我們尋找具有可信來源的行業標準標識符的原因:書籍的ISBN,汽車的VIN,ISO 4217的貨幣,ISO 3166的國家等。
- 1. 處理數據倉庫中的重複項
- 2. 處理重複的數據庫條目
- 3. 如何處理scrapy中的重複項?
- 4. 如何處理單個列數據庫中的重複條目?
- 5. geom_tile()如何處理重複的數據?
- 6. 處理SSRS參數中的重複項
- 7. 處理MPEG2-TS中的重複數據
- 8. 在.NET中正確處理數據庫中的重複行
- 9. 防止數據庫中的重複項
- 10. 處理數據倉庫加載中的主鍵重複
- 11. pentaho的複製塊如何處理重複數據?
- 12. 如何處理重複的參數?
- 13. 如何在Android的選項卡活動中處理數據庫
- 14. Android如何檢查我的sqlite數據庫中的重複項?
- 15. php - laravel:如何處理數據庫中的時間重疊?
- 16. 從數據庫中刪除重複項
- 17. 如何在c中處理數據庫#
- 18. 如何處理github託管項目上的數據庫憑據?
- 19. 如何刪除MS SQL數據庫中的部分重複項?
- 20. 修復數據庫重複項(MySQL bug)
- 21. 如何處理SQL中的重複行?
- 22. ImageList.ImageCollection如何處理重複?
- 23. 如何處理斷開的對象圖中的重複項?
- 24. 如何處理Ember商店中可能的重複項?
- 25. 如何處理重複數據的抓取?
- 26. 如何從數據庫中刪除重複項?
- 27. 如何在數據庫中查找重複項?
- 28. 如何將數據庫中的數據處理成數組?
- 29. 過濾批處理參數數組中的重複項
- 30. 在SQL Server中如何處理重複
在現實世界中,您經常需要預先驗證事物像這樣在你的應用程序擊中數據庫之前。例如,如果你有一個Web UI,你可能需要做簡單的表單驗證。 – seand
例外有性能損失。嘗試和避免例外通常更高效。只有發生異常時,您纔會在聲明try catch塊時承擔任何費用。如果您的程序正在執行大量插入,則使用異常捕獲時性能可能會成爲問題。 –