您目前已離線,請等候您的網際網路重新連線

不支援您的瀏覽器

您必須更新瀏覽器,才能使用此網站。

更新至最新版本的 Internet Explorer

如何從 SQL Server 中的資料表中移除重複的資料列

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:139444
結論
Microsoft SQL Server 資料表不應該包含重複的資料列,nornon 唯一的主索引鍵。為了簡潔起見,我們有時將 primarykeys 為"key"或"PK"本篇文章中,但這將會永遠表示 「 primarykey 」。重複的 PKs 實體完整性的違規情形,而且應該 bedisallowed 關聯式系統中。SQL Server 具有各種機制 forenforcing 實體完整性,包括索引、 唯一條件約束、 主索引鍵條件約束和觸發程序。

儘管有出現,在不尋常的情況下可能會發生重複的主索引鍵,而如果是這樣必須消滅。它們可能會發生的方法之一,是如果 duplicatePKs 存在於 SQL Server 及資料 isimported 以外的非關聯式資料而不強制 PK 唯一性。另一種方式就是透過資料庫設計錯誤,例如未強制執行每個資料表上的 entityintegrity 的 canoccur。

通常當您嘗試建立唯一的索引,如果找不到重複的索引鍵會中止時,會注意到重複的 PKs。此訊息是:
訊息 1505,層次 16,狀態 1 請建立唯一索引中止上重複的索引鍵。
如果您使用 SQL Server 2000年或 SQL Server 2005,您可能會收到下列錯誤訊息:
訊息 1505,層次 16,狀態 1 建立唯一索引終止,因為找不到物件名稱的重複的索引鍵 '%* 3! 和索引名稱' %* ls'。重複索引鍵的值是 %1!。
本文將告訴您如何找出並移除重複的主索引鍵 froma 資料表。不過,您應該仔細檢查程序允許發生以避免循環的 theduplicates。

其他相關資訊
這個範例中,我們將使用下表重複 PK 值。在這個表格的主索引鍵是兩個欄位 (欄 1,第 2 欄)。我們 cannotcreate 唯一索引或主索引鍵條件約束,因為兩個資料列的 haveduplicate PKs。此程序說明如何識別和移除 theduplicates。
create table t1(col1 int, col2 int, col3 char(50))insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 2, 'data value two')				
識別哪些資料列有重複的主索引鍵值為第一個步驟:
SELECT col1, col2, count(*)FROM t1GROUP BY col1, col2HAVING count(*) > 1				
這會傳回一個資料列重複 PK 值的每一組資料表中。在此結果中的最後一欄是 theparticular PK 值重複的項目數目。

欄 1第 2 欄
112


如果有重複的 PK 值只有幾組,最佳的程序 isto 會刪除這些檔案以手動方式在個別的基礎上。例如:
set rowcount 1delete from t1where col1=1 and col2=1				
資料列計數值應該是 n-1 指定的機碼值的複本數目。在這個範例中,有 2 重複使資料列計數設定為 1。欄 1/第 2 欄值是取自上述群組依據查詢結果。如果群組由查詢傳回多個資料列,「 設定資料列計數 」 查詢必須執行一次每個這些資料列。每次執行時,將 rowcount 設定為 n-1 的特定 PK 值重複的項目數目。

在刪除之前的資料列,您應該確認整個資料列 isduplicate。雖然不太可能,很可能 PK 值有重複,但不是整個資料列。這個範例就是表格 withSocial 號碼作為主索引鍵,而有具有相同數目的兩個不同的人 (或列),每一個獨特的屬性。在 sucha 的情況下任何機能故障而造成重複的索引鍵可能也 causedvalid 放在資料列中的唯一資料。這項資料應該研究和之前刪除的資料可能對帳的複製出 andpreserved。

如果有許多不同一組重複 PK 值在資料表中,它可能會非常耗時個別移除它們。在此情況下可以使用 ︰ 程序:
  1. 首先,請執行上述群組依據查詢以判斷多少一組重複 PK 值存在,以及每一組重複的項目計數。
  2. 保留資料表中選取重複的索引鍵值。例如:
    SELECT col1, col2, col3=count(*)INTO holdkeyFROM t1GROUP BY col1, col2HAVING count(*) > 1					
  3. 選取重複的資料列將保留資料表中,去除重複項目程序中。例如:
    SELECT DISTINCT t1.*INTO holddupsFROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  4. 此時,holddups 資料表應該有唯一的 PKs,不過,這將不是大小寫如果 t1 具有重複的 PKs,但唯一的資料列 (如上述的 SSN 範例)。請確認在 holddups 中的每個索引鍵是唯一的而且不需要重複的索引鍵,但唯一的資料列。因此,您必須在此停止,並調解其中一個資料列如果您想要保留指定的重複索引鍵值。例如,查詢:
    SELECT col1, col2, count(*)FROM holddupsGROUP BY col1, col2						
    應該會傳回 1,每個資料列的計數。如果是,繼續進行下面的步驟 5。如果不存在,您會有重複的索引鍵,但唯一的資料列,並需要決定要儲存的資料列。這通常會伴隨捨棄一列,或是建立新的唯一索引鍵值給這個資料列。您可以採取的這兩個步驟之一的 holddups 資料表中每一個這類重複 PK。
  5. 從原始資料表刪除重複的資料列。例如:
    DELETE t1FROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  6. 將唯一的資料列放回原始的資料表中。例如:
    INSERT t1 SELECT * FROM holddups					
sql6 dedupe 實體 intg

警告:本文為自動翻譯

內容

文章識別碼:139444 - 最後檢閱時間:07/04/2015 04:23:00 - 修訂: 5.0

  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • kbsqlsetup kbinfo kbusage kbmt KB139444 KbMtzh
意見反應
0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">