許多資料庫管理員(DBA)需要至少要花費一段時間來嘗試從資料庫資料表中識別和刪除重複記錄。如果一開始多關注防止重複插入,那麼識別和刪除重複記錄所花費的大部分時間都可以用於其他工作上。原則上,這並不難做到。但是,實際上,你可能甚至根本不知道有重複的列!今天的博文章將會介紹一些策略,透過防止將重複記錄插入資料庫資料表中來減少重複記錄的發生。
使用主索引鍵和唯一鍵索引
為了確保資料表中的列是唯一的,必須限制一個或多個欄以拒絕非唯一的值。達到此項要求,可以使用資料表的任何唯一識別元快速擷取資料表中的任何列。我們可以透過在適用的欄用中包含主索引鍵或唯一鍵索引來強制實施列的唯一性。
舉例來說,讓我們看一個包含產品詳細資料的資料表,例如名稱、系列、供應商、描述等。以下是它在 Navicat 資料表設計器中的樣子:
Navicat 使用「鍵」標題下的鑰匙圖示指示作為鍵一部分的欄位,並用數字表示其在組合鍵中的位置。附有數1的單個鑰匙圖示讓我們知道 productCode是資料表的唯一主索引鍵(PK)欄。根據定義,主索引鍵必須是唯一的,並且不能包含 NULL 值。
同時,如果我們再看一下「索引」索引標籤,它表明已為 productLine 欄編製索引:
在許多情況下,單一欄不足以使一列成為唯一的,因此我們必須在主索引鍵中加入其他欄位。以下是一個需要同時使用 customerNumber 和 checkNumber 作為唯一主索引鍵的 payments 資料表,因為同一位客戶可以進行多次付款交易:
自動遞增的主索引鍵的缺點
許多資料庫設計人員或開發人員(包括我自己!)喜歡使用數字自動遞增的主索引鍵,因為:
- 易於使用。資料庫會負責它們!
- 因為每個新列都有一個唯一的整數,所以不會有衝突。
以下就是一個這樣的資料表:
在 Navicat 中,建立自動遞增的主索引鍵所需要做的就是選擇數字資料類型(例如整數)並勾選「自動遞增」方塊。資料庫將會為該欄產生所有值。
現在,壞消息來了。自動遞增的主索引鍵並不能防止重複的列,尤其是當你沒有任何其他資料表索引時。例如,假設資料表沒有任何其他索引。這就不能阻止有人插入與現有列具有相同的 first_name 和 last_name 的列。
實際上,我們現在可以測試該理論!在 Navicat 中,我們可以按一下加號(+)按鈕將新列直接插入到網格中:
正如預期的那樣(害怕),重複的名稱已被接受!
總結
今天的故事值得注意的是,儘管有方法可以防止插入重複的列,但這並不一定意味著可以防止所有資料重複。至少,設計人員或開發人員必須採取其他預防措施,如果不是在資料庫設計中採用嚴格的正規化,就是在應用程式層級執行特定的驗證。