成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對SQL Server 表中的重復行的正確刪除

數據庫 SQL Server
我們今天主要向大家講述的是正確刪除 SQL Server 表的重復行的實際操作步驟與實現其正確操作所要用到的代碼描述。

此文主要向大家講述的是正確刪除 SQL Server 表的重復行的實際操作步驟,以及對正確刪除 SQL Server 表的重復行的實際操作過程中,值得我們大家注意的相關事項的描述,以下就是文章的主要內容描述。

Microsoft SQL Server 表不應該包含重復行和非唯一主鍵。為簡潔起見,在本文中我們有時稱主鍵為“鍵”或“PK”,但這始終表示“主鍵”。重復的 PK 違反了實體完整性,在關系系統中是不允許的。SQL Server 有各種強制執行實體完整性的機制,包括索引、唯一約束、主鍵約束和觸發器。

盡管如此,在某些情況下還可能會出現重復的主鍵;如果出現此類情況,就必須清除重復主鍵。出現重復主鍵的情形之一是,在 SQL Server 外部的非關系數據中存在重復的 PK,在導入這些數據時沒有強制執行 PK 唯一性。出現重復主鍵的另一種情形來自數據庫設計錯誤,如沒有對每張表強制執行實體完整性。

通常在嘗試創建唯一索引時會發現重復的 PK,因為如果找到重復的鍵,唯一索引的創建即會中止,并且將顯示以下消息:

 

  1. Msg 1505, Level 16, State 1 Create unique index aborted on duplicate key. 

如果使用的是 SQL Server 2000 或 SQL Server 2005,則會收到以下錯誤消息:

Msg 1505, Level 16, State 1 CREATE UNIQUE INDEX terminated because a duplicate key was found for object name '%.*ls' and index name '%.*ls'.The duplicate key value is %ls.

本文討論如何查找和刪除表中重復的主鍵。但是,您應該仔細檢查出現重復鍵的進程以避免重復出現。

更多信息

在該示例中,我們將使用下表,它具有重復的 PK 值。在該SQL Server 表中,主鍵是兩列(col1、col2)。我們無法創建唯一索引或主鍵約束,因為這兩行具有重復的 PK。該過程演示如何識別和刪除重復的主鍵。

 

  1. create table t1(col1 int, col2 int, col3 char(50))   
  2. insert into t1 values (1, 1, 'data value one')   
  3. insert into t1 values (1, 1, 'data value one')   
  4. insert into t1 values (1, 2, 'data value two') 

第一步是識別哪些行具有重復的主鍵值:

 

  1. SELECT col1, col2, count(*)   
  2. FROM t1   
  3. GROUP BY col1, col2   
  4. HAVING count(*) > 1 

這將為SQL Server 表中的每組重復的 PK 值返回一行。此結果中的最后一列是特定 PK 值的重復數。

 

  1. col1 col2   
  2. 1 1 2 

如果只有幾組重復的 PK 值,則最佳方法是手動逐個刪除它們。例如:

 

  1. set rowcount 1   
  2. delete from t1   
  3. where col1=1 and col2=1 

rowcount 值應該是給定鍵值的重復數減去 1。在該示例中,有 2 個重復的主鍵,所以 rowcount 被設置為 1。col1/col2 值來自上面的 GROUP BY 查詢結果。如果 GROUP BY 查詢返回多行,則“set rowcount”查詢將必須為這些行中的每一行各運行一次。每次運行該查詢時,將 rowcount 設置為特定 PK 值的重復數減去 1。

在刪除行之前,您應該驗證是否整行重復。雖然整行重復不太可能發生,但可能 PK 值重復,而整行不重復。例如一個將身份證號碼作為主鍵的表,該表有兩個具有相同號碼的不同的人(即行),但每個人有唯一的屬性。在這種情況下,任何引起重復鍵的問題可能還引起在行中放入有效的唯一的數據。在刪除該數據之前,應該將該數據復制出來并保存下來以進行研究和適當的調整。

如果表中有多組完全不同的重復的 PK 值,則逐個刪除它們會很費時間。在這種情況下,可使用下面的方法: 1.首先,運行上面的 GROUP BY 查詢來確定有多少組重復的 PK 值及每組的重復數。

2.選擇重復的鍵值放入臨時表中。例如:

 

  1. SELECT col1, col2, col3=count(*)   
  2. INTO holdkey   
  3. FROM t1   
  4. GROUP BY col1, col2   
  5. HAVING count(*) > 1 

3.選擇重復的行放入臨時表中,以清除進程中的重復值。例如:

 

  1. SELECT DISTINCT t1.*   
  2. INTO holddups   
  3. FROM t1, holdkey   
  4. WHERE t1.col1 = holdkey.col1   
  5. AND t1.col2 = holdkey.col2 

4.此時,holddups 表應有唯一的 PK;但是,如果 t1 有重復的 PK 而行唯一(如上面的 SSN 示例),情況就不是這樣了。請驗證 holddups 中的各個鍵是否唯一,是否沒有鍵重復而行唯一的情況。如果是這樣,您必須停在該處,確定對于給定重復的鍵值,您希望保留哪些行。例如,以下查詢:

 

  1. SELECT col1, col2, count(*)   
  2. FROM holddups   
  3. GROUP BY col1, col2 

應為各行返回計數 1。如果結果是 1,請繼續執行下面的步驟 5。如果不是 1,則存在鍵重復而行唯一的情況,且需要您決定要保存哪些行。通常,這將需要舍棄行或為此行創建新的唯一的鍵值。為 holddups 表中每個此種重復 PK 執行這兩個步驟之一。

5.從原始SQL Server 表中刪除重復的行。例如:

 

  1. DELETE t1   
  2. FROM t1, holdkey   
  3. WHERE t1.col1 = holdkey.col1   
  4. AND t1.col2 = holdkey.col2 

6.將唯一行放回原始表中。例如:

  1. INSERT t1 SELECT * FROM holddups 

以上的相關內容就是對如何刪除 SQL Server 表中的重復行的介紹,望你能有所收獲。

【編輯推薦】

  1. SQL Server中用戶名與登錄名關系辨析談
  2. SQL Server中數據該如何導入導出?
  3. SQL Server 2005降級到2000的正確操作步驟
  4. SQL Server數據庫之查看SQL日志文件大小的命令
  5. SQL Server自增字段插入值的步驟
責任編輯:佚名 來源: 互聯網
相關推薦

2010-07-12 09:52:24

刪除 SQL Serv

2009-04-20 15:54:04

SQL Server重復行

2010-09-01 16:47:18

SQL刪除

2010-09-02 16:28:03

SQL刪除

2010-10-22 16:29:11

SQL Server刪

2010-09-02 11:34:51

SQL刪除

2010-07-08 13:20:05

SQL Server刪

2010-07-05 15:58:23

SQL Server

2010-11-10 11:27:40

SQL Server重

2010-07-21 13:17:47

SQL Server表

2010-07-08 14:42:34

SQL Server臨

2010-07-07 16:53:54

SQL Server重

2010-09-02 10:36:51

SQL刪除

2010-07-13 16:48:14

SQL Server

2010-11-10 11:37:29

SQL Server刪

2023-02-26 23:31:01

SQL數據庫

2010-07-08 12:52:58

SQL Server

2010-07-12 10:13:44

SQL Server表

2010-07-15 13:54:47

2010-07-08 13:06:05

SQL Server刪
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美国产日韩在线观看 | 91在线一区二区 | 视频一区在线观看 | 日本福利片 | 国产精品久久久久久吹潮 | 欧美精品一二三 | 一级黄色大片 | 久久99精品久久久久久琪琪 | 99精品视频在线 | 99精品久久久 | 国产一区二区三区四区在线观看 | 免费观看一级特黄欧美大片 | 日本免费一区二区三区四区 | 色爱综合 | 国产日韩欧美在线一区 | 在线中文字幕日韩 | 黄色国产大片 | 亚洲高清免费观看 | 成人做爰999 | 国产色| 国产高清免费视频 | 久久一 | 精品一区欧美 | 午夜视频在线观看网址 | 欧美激情国产精品 | 中文字幕在线观看 | 免费一级做a爰片久久毛片潮喷 | 国产精品国产三级国产aⅴ中文 | 国产精品久久av | 亚洲第一在线 | 成人精品系列 | 国产精品一卡 | 欧美jizzhd精品欧美巨大免费 | 日本欧美黄色片 | 精品久久久久久久久久久久久久久久久 | 免费国产一区二区视频 | av中文在线播放 | 欧洲一级黄 | 一区二区三区国产精品 | 国产精品久久久久久久粉嫩 | 婷婷开心激情综合五月天 |