2010-07-28 77 views
2

我只想將唯一記錄添加到數據庫表中。有沒有辦法做到這一點,而不必做選擇來查看當前記錄是否已經存在,因爲隨着表的增長,這將非常耗時。我接受所有類型的建議(如果存在)。如何僅以可擴展的方式向數據庫添加唯一記錄

此外,作爲一種可能的替代方案,可能有一些索引選項可以使這些選擇更快,或者可以按照使select語句執行速度更快的方式對數據進行排序。

我正在使用MySQL和Java。

+0

看來答案一般會是NO。所以謝謝,這也有幫助,知道什麼是不可能的。 – Ankur 2010-07-28 09:10:40

+1

從你的評論到Vinko的回答,我假設你想阻止必須將數據轉換爲記錄格式?雖然它不會幫助你解決你最初的問題,但是如果你用最近插入的記錄的標識數據在內存中保存一個HashSet,它可能會有所幫助。這允許您跳過最近插入數據的選擇,這可能是流量的90%,具體取決於您的應用程序行爲。如果在該組中找不到數據,則需要執行選擇以確保。 – rsp 2010-07-28 09:27:10

+0

是的,這會有所幫助。 – Ankur 2010-07-28 09:31:16

回答

1

有兩種可能性。

  1. 假設它不是重複的,所以執行INSERT並通過執行UPDATE來應付err。
  2. 假設它是重複的,所以通過執行INSERT來執行UPDATE並處理錯誤。

哪個更好取決於相對概率。

+0

這是一個很好的解決方案。 – Ankur 2010-07-30 03:47:19

1

有人將不得不執行檢查,除非您可以從數據中推斷出它是否已經存儲過,如果可能取決於數據和用例。

鑑於有人不得不做檢查,爲什麼不讓數據庫檢查它呢?它會檢查它的唯一索引(你有一個唯一的索引並強制執行,對嗎?),如果記錄已經存在,則返回一個錯誤。

IOW,只是嘗試插入並捕獲任何產生的錯誤,如果錯誤是重複鍵錯誤,則跳過該記錄。

+0

我錯誤地表達了自己,當然有一個唯一的索引,但記錄不是一條記錄,而是一組相當於記錄的數據。但我想我會做選擇。 – Ankur 2010-07-28 09:08:57

+0

相當於記錄和記錄的一組數據以何種方式不同? – 2010-07-28 09:13:44

+0

等價的數據具有相同的字段,但不具有唯一的ID - 因此它不是100%相同,但從用戶的角度來看,它具有相同的數據。 – Ankur 2010-07-28 09:30:26

3

最簡單的方法是讓數據庫實施唯一性(爲索引設置的唯一鍵很可能會很好),因此任何重複都會被拒絕。您的代碼然後需要忽略拒絕消息。

1

您可能會將數據加載到tmp表中,而不是從該表中加載所有tmp.id!= id結果,然後截斷tmp。

如果插入事務不那麼重要,您可以創建一個唯一的約束。

爲了更快地訪問,只需創建一個私鑰,這將爲您的表創建一個聚簇索引。訪問時間會非常快。

+0

謝謝你將看看這些想法 – Ankur 2010-07-28 09:21:24