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

對(duì)SQL Server 表中的重復(fù)行的正確刪除

數(shù)據(jù)庫(kù) SQL Server
我們今天主要向大家講述的是正確刪除 SQL Server 表的重復(fù)行的實(shí)際操作步驟與實(shí)現(xiàn)其正確操作所要用到的代碼描述。

此文主要向大家講述的是正確刪除 SQL Server 表的重復(fù)行的實(shí)際操作步驟,以及對(duì)正確刪除 SQL Server 表的重復(fù)行的實(shí)際操作過(guò)程中,值得我們大家注意的相關(guān)事項(xiàng)的描述,以下就是文章的主要內(nèi)容描述。

Microsoft SQL Server 表不應(yīng)該包含重復(fù)行和非唯一主鍵。為簡(jiǎn)潔起見(jiàn),在本文中我們有時(shí)稱(chēng)主鍵為“鍵”或“PK”,但這始終表示“主鍵”。重復(fù)的 PK 違反了實(shí)體完整性,在關(guān)系系統(tǒng)中是不允許的。SQL Server 有各種強(qiáng)制執(zhí)行實(shí)體完整性的機(jī)制,包括索引、唯一約束、主鍵約束和觸發(fā)器。

盡管如此,在某些情況下還可能會(huì)出現(xiàn)重復(fù)的主鍵;如果出現(xiàn)此類(lèi)情況,就必須清除重復(fù)主鍵。出現(xiàn)重復(fù)主鍵的情形之一是,在 SQL Server 外部的非關(guān)系數(shù)據(jù)中存在重復(fù)的 PK,在導(dǎo)入這些數(shù)據(jù)時(shí)沒(méi)有強(qiáng)制執(zhí)行 PK 唯一性。出現(xiàn)重復(fù)主鍵的另一種情形來(lái)自數(shù)據(jù)庫(kù)設(shè)計(jì)錯(cuò)誤,如沒(méi)有對(duì)每張表強(qiáng)制執(zhí)行實(shí)體完整性。

通常在嘗試創(chuàng)建唯一索引時(shí)會(huì)發(fā)現(xiàn)重復(fù)的 PK,因?yàn)槿绻业街貜?fù)的鍵,唯一索引的創(chuàng)建即會(huì)中止,并且將顯示以下消息:

 

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

如果使用的是 SQL Server 2000 或 SQL Server 2005,則會(huì)收到以下錯(cuò)誤消息:

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.

本文討論如何查找和刪除表中重復(fù)的主鍵。但是,您應(yīng)該仔細(xì)檢查出現(xiàn)重復(fù)鍵的進(jìn)程以避免重復(fù)出現(xiàn)。

更多信息

在該示例中,我們將使用下表,它具有重復(fù)的 PK 值。在該SQL Server 表中,主鍵是兩列(col1、col2)。我們無(wú)法創(chuàng)建唯一索引或主鍵約束,因?yàn)檫@兩行具有重復(fù)的 PK。該過(guò)程演示如何識(shí)別和刪除重復(fù)的主鍵。

 

  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') 

第一步是識(shí)別哪些行具有重復(fù)的主鍵值:

 

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

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

 

  1. col1 col2   
  2. 1 1 2 

如果只有幾組重復(fù)的 PK 值,則最佳方法是手動(dòng)逐個(gè)刪除它們。例如:

 

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

rowcount 值應(yīng)該是給定鍵值的重復(fù)數(shù)減去 1。在該示例中,有 2 個(gè)重復(fù)的主鍵,所以 rowcount 被設(shè)置為 1。col1/col2 值來(lái)自上面的 GROUP BY 查詢(xún)結(jié)果。如果 GROUP BY 查詢(xún)返回多行,則“set rowcount”查詢(xún)將必須為這些行中的每一行各運(yùn)行一次。每次運(yùn)行該查詢(xún)時(shí),將 rowcount 設(shè)置為特定 PK 值的重復(fù)數(shù)減去 1。

在刪除行之前,您應(yīng)該驗(yàn)證是否整行重復(fù)。雖然整行重復(fù)不太可能發(fā)生,但可能 PK 值重復(fù),而整行不重復(fù)。例如一個(gè)將身份證號(hào)碼作為主鍵的表,該表有兩個(gè)具有相同號(hào)碼的不同的人(即行),但每個(gè)人有唯一的屬性。在這種情況下,任何引起重復(fù)鍵的問(wèn)題可能還引起在行中放入有效的唯一的數(shù)據(jù)。在刪除該數(shù)據(jù)之前,應(yīng)該將該數(shù)據(jù)復(fù)制出來(lái)并保存下來(lái)以進(jìn)行研究和適當(dāng)?shù)恼{(diào)整。

如果表中有多組完全不同的重復(fù)的 PK 值,則逐個(gè)刪除它們會(huì)很費(fèi)時(shí)間。在這種情況下,可使用下面的方法: 1.首先,運(yùn)行上面的 GROUP BY 查詢(xún)來(lái)確定有多少組重復(fù)的 PK 值及每組的重復(fù)數(shù)。

2.選擇重復(fù)的鍵值放入臨時(shí)表中。例如:

 

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

3.選擇重復(fù)的行放入臨時(shí)表中,以清除進(jìn)程中的重復(fù)值。例如:

 

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

4.此時(shí),holddups 表應(yīng)有唯一的 PK;但是,如果 t1 有重復(fù)的 PK 而行唯一(如上面的 SSN 示例),情況就不是這樣了。請(qǐng)驗(yàn)證 holddups 中的各個(gè)鍵是否唯一,是否沒(méi)有鍵重復(fù)而行唯一的情況。如果是這樣,您必須停在該處,確定對(duì)于給定重復(fù)的鍵值,您希望保留哪些行。例如,以下查詢(xún):

 

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

應(yīng)為各行返回計(jì)數(shù) 1。如果結(jié)果是 1,請(qǐng)繼續(xù)執(zhí)行下面的步驟 5。如果不是 1,則存在鍵重復(fù)而行唯一的情況,且需要您決定要保存哪些行。通常,這將需要舍棄行或?yàn)榇诵袆?chuàng)建新的唯一的鍵值。為 holddups 表中每個(gè)此種重復(fù) PK 執(zhí)行這兩個(gè)步驟之一。

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

 

  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 

以上的相關(guān)內(nèi)容就是對(duì)如何刪除 SQL Server 表中的重復(fù)行的介紹,望你能有所收獲。

【編輯推薦】

  1. SQL Server中用戶(hù)名與登錄名關(guān)系辨析談
  2. SQL Server中數(shù)據(jù)該如何導(dǎo)入導(dǎo)出?
  3. SQL Server 2005降級(jí)到2000的正確操作步驟
  4. SQL Server數(shù)據(jù)庫(kù)之查看SQL日志文件大小的命令
  5. SQL Server自增字段插入值的步驟
責(zé)任編輯:佚名 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-07-12 09:52:24

刪除 SQL Serv

2009-04-20 15:54:04

SQL Server重復(fù)行

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數(shù)據(jù)庫(kù)

2010-07-08 12:52:58

SQL Server

2010-07-08 13:06:05

SQL Server刪

2010-07-21 11:38:59

SQL Server重

2010-07-26 14:58:26

SQL Server刪
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩精品成人 | 91精品国产乱码久久蜜臀 | 蜜桃视频麻豆 | 日日噜噜噜夜夜爽爽狠狠视频97 | 午夜精品久久久久久久99黑人 | 亚洲国产午夜 | 一区二区成人 | 欧美成人精品一区二区三区 | 国产特级毛片aaaaaa | 992人人草 | 欧美精品一区免费 | 男女羞羞视频在线看 | 精品欧美乱码久久久久久1区2区 | 国产精品视频999 | 国产精品视频免费 | 中国一级大黄大片 | 免费xxxx大片国产在线 | 男女性毛片 | 久久精品国产一区二区三区 | 欧美精品久久久久久久久老牛影院 | 丁香五月网久久综合 | 日韩中文一区 | 久久一久久 | 日韩一级精品视频在线观看 | 青春草91| 亚洲精品一二三区 | 看羞羞视频 | 性大毛片视频 | 久久国产精品视频免费看 | 国产精品视频一二三区 | 国产一区二区三区在线 | 天堂中文在线观看 | 男人天堂99| 色婷婷精品国产一区二区三区 | 欧美久久久久久 | 国产成人一区在线 | 999精品视频 | 国产一区二区三区在线观看免费 | 电影在线| 国产精品自拍啪啪 | 欧美一级α片 |