sdfsdnfslk 发表于 2018-10-18 08:51:47

sql server 删除数据的几种方法

  最近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]
查看完整版本: sql server 删除数据的几种方法