我正在編寫一個程序,它將結構化數據從(損壞)文件中恢復爲單個記錄,並將結果收集到sqlite數據庫中。如何防止將相同記錄添加到SQL數據庫
該程序被調用幾次,具有稍微不同的恢復參數。這導致通常恢復相同的文件,但有時會從文件中恢復不同的數據。
現在,我每次運行帶有不同參數的程序時,都應該只添加新的(不同的)找到的項目到同一個數據庫。
這意味着我需要一種快速的方式來判斷每個恢復的記錄是否已經存在於數據庫中,以便只有在數據庫中不存在時才添加它們。
我知道對於每一個我想添加的記錄,我都可以先對所有列做SELECT操作,看看數據庫中是否有匹配的記錄,只有在找不到相同的記錄時才添加新的記錄。
但是,由於我添加了10000個記錄,對這些記錄中的每一個做SELECT都對我來說效率很低(很慢)。
我不知道是否有更聰明的方法來處理這個問題? I.e,有沒有辦法告訴sqlite我不想重複條目,所以它會自動檢測並拒絕它們?我知道UNIQUE修飾符,但那不是因爲它適用於單列,不是嗎?我需要能夠說COL1 + COL2 + COL3的組合必須是唯一的。有沒有辦法做到這一點?
注意:我從不想更新任何現有記錄。我只想收集一組不同的記錄。
獎金部分 - 性能
在一個經典的編程語言,我會使用一個鍵值字典,其中的關鍵是所有記錄的值的總和。同樣,我可以爲每個添加的記錄計算哈希代碼,並首先查看哈希代碼。如果沒有匹配,那麼記錄肯定不在數據庫中;如果有匹配,我仍然需要在數據庫中搜索任何重複項。那肯定會更快,但我仍然懷疑sqlite是否可以讓這個效率更高。
性能如何?它只是單獨搜索所有項目,還是會使用一些更智能(更快)的算法,例如像使用哈希來加快速度? –
同時具有多列的UNIQUE:[對於表上的每個UNIQUE約束,每行必須具有由UNIQUE約束標識的列中唯一值的組合。](http://www.sqlite.org/lang_createtable.html) – danihp
@ThomasTempelmann查找這是一個問題,如果你有該列的索引,你可以加快查找確定... – aleroot