设为首页 收藏本站
查看: 792|回复: 0

[经验分享] sql server 删除数据的几种方法

[复制链接]

尚未签到

发表于 2018-10-18 08:51:47 | 显示全部楼层 |阅读模式
  最近2天需要删除一些sqlserver里的数据。于是查了资料,得到以下的一些信息,看起来应该挺有用。不过还没有一一试验,先转过来,有时间的时候看看。呵呵
SQL Server中删除重复数据:
  《-》
  由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进行删除的时候有许多种方法。我发现在网上流行的一种方法是利用临时表的方法,sql脚本如下:
  select distinct * into #Tmp from tableName
  drop table tableName
  select * into tableName from #Tmp
  drop table #Tmp
  该方法首先使用select distinct命令将不重复的列表数据写入到临时表#Tmp中,然后删除原来的表,再将临时表中的数据写入到tableName中,最后删除临时表。
  但是这种方法执行效率是一个方面,另外如果数据库中有text类型的字段的话将不能执行,非常的有局限性。
  下面提供一个通用的方法并且执行效率也是非常不错的,教本如下:
  下载: cleanRepeatedRows2.sql
  declare @max int,@rowname varchar(400)
  declare cur_rows cursor local for
  select repeatedrow,count(*) from tableName group by repeatedrow having count(*) > 1
  open cur_rows
  fetch cur_rows into @rowname ,@max
  while @@fetch_status=0
  begin
  select @max = @max -1
  set rowcount @max
  delete from tableName where repeatedrow = @rowname
  fetch cur_rows into @rowname ,@max
  end
  close cur_rows
  set rowcount 0简单说明一下:首先声明了两个变量,一个是记录重复的数量,另外一个是记录重复字段的值,变量的类型以及长度可根据你实际的字段进行定义;接下来声明一个游标,该游标主要是列出重复的数据以及重复的数量;然后打开游标并从中取出数据,其中“select @max = @max -1”这句的意思是保留一条重复数据,剩下的逐一删除;最后关闭游标,搞定。
  执行完教本之后可以使用下面的教本检查是否含有重复的数据:
  select repeatedrow,count(*) from tableName group by repeatedrow having count(*) > 1
  《二》
  数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
  方法一
declare @max integer,@id integer  declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
  open cur_rows
  fetch cur_rows into @id,@max
  while @@fetch_status=0
  begin
  select @max = @max -1
  set rowcount @max
  delete from 表名 where 主字段 = @id
  fetch cur_rows into @id,@max
  end
  close cur_rows
  set rowcount 0
  方法二
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
  1、对于第一种重复,比较容易解决,使用
select distinct * from tableName  就可以得到无重复记录的结果集。
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName  drop table tableName
  select * into tableName from #Tmp
  drop table #Tmp
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select>select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID  select * from #Tmp where autoID in(select autoID from #tmp2)
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
  删除数据的方法:
  如果你的硬盘空间小,并且不想设置数据库的日志为最小(因为希望其他正常的日志希望仍然记录),而且对速度要求比较高,并清除所有数据的建议你用turncate table1,因为truncate 是DDL操作,不产生rollback,不写日志速度快一些,然后如果有自增的话,恢复到1开始,而delete会产生rollback,如果删除大数据量的表速度会很慢,同时会占用很多的rollback segments,同时还要记录下G级别的日志 ;当然如果有条件删除比如where time

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623016-1-1.html 上篇帖子: SQL Server 2008数据备份与还原(原理篇) 下篇帖子: Microsoft SQL Server 2005 Database Encryption Step-by-Step
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表