Sql Server表裡面有2行數據完全一樣,如何刪除?

淚鋶滿靣


這問題有意思啊,我也碰到過,如果是在企業管理器裡面,打開表內容之後直接刪除是不行的,但如果您要通過SQL語句刪除,兩條記錄必須有不一致的地方。

在企業管理器中無法刪除

比如建立了一張表,如下圖所示,兩個字段:

真是一模一樣的記錄,我們在一條記錄上點右鍵,選擇刪除,如下圖所示:

結果是無法刪除的,提示兩條記錄內容一致無法刪除,如下圖所示:

那是不是說就無法刪除了呢?當然不是,有一個方法雖然笨一些,但總還可以刪除的。

創建自增主鍵將兩條記錄搞成不一樣

之所以無法刪除,原因就是兩條記錄“一模一樣”,想要刪除,就把它們搞成不一樣,比如,增加一個自增字段,如下圖所示:

增加了自增字段之後,兩條記錄就不同了,如下圖所示:

既然兩條記錄不同,而且有一個永不重複的字段區分開了,想要刪除就很容易。

刪除數據並還原數據表結構

您可以在查詢分析器中直接刪除,也可以寫個SQL刪除,比如:

delete test where FID=2

腳本及執行結果如下圖所示:

回頭再把新增的字段幹掉,看上去不留痕跡,如下圖所示:

怎麼樣,這活幹的漂亮吧,哈哈。


靈眼旁觀


正常情況下,項目中的每張表都需要建一個唯一主鍵來避免數據重複的問題,假如插入或者更新成表中已存在的主鍵,執行語句是會直接報錯的。而假如沒有主鍵,數據庫是允許添加同樣的數據的,針對數據重複的情況,可以採用如下方法解決:基本思路就是通過關鍵字distinct篩選出非重複數據並插入臨時表,再把原表數據刪除,最後把臨時表的數據移到原表並刪除臨時表。


演示步驟:

  • 先建一張沒有主鍵的userinfo表,並往表中插入三條重複數據

USE [test]

GO

/****** Object: Table [dbo].[userinfo] Script Date: 2019-06-11 12:21:00 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[userinfo](

[username] [nvarchar](50) NOT NULL,

[sex] [nvarchar](50) NOT NULL

) ON [PRIMARY]

GO

insert into userinfo(username,sex) values('xiaoming','nan');

insert into userinfo(username,sex) values('xiaoming','nan')

insert into userinfo(username,sex) values('xiaoming','nan')

  • 用distinct關鍵字篩選出userinfo表中非重複數據,並插入臨時表temp

select distinct * into #temp from userinfo

  • 清空userinfo表

delete userinfo

  • 把臨時表數據複製到userinfo表

insert userinfo select * from #temp

  • 刪除臨時表

drop table #temp

以上為個人觀點,歡迎在評論中發表自己不同的觀點,喜歡的加個關注,謝謝。


分享到:


相關文章: