sqlrver删除数据的⼏种⽅法
最近2天需要删除⼀些s q l s e r v e r⾥的数据。于是查了资料,得到以下的⼀些信息,看起来应该挺有⽤。不过还没有⼀⼀试验,先转过来,有时间的时候看看。呵呵
S Q L S e r v e r中删除重复数据:
《-》
由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进⾏删除的时候有许多种⽅法。我发现在⽹上流⾏的⼀种⽅法是利⽤临时表的⽅法,s q l脚本如下:
s e l e c t d i s t i n c t*i n t o#T m p f r o m t a b l e N a m e
d r o p t a b l
e t a b l e N a m e
s e l e c t*i n t o t a b l e N a m e f r o m#T m p
d r o p t a b l e#T m p
该⽅法⾸先使⽤s e l e c t d i s t i n c t命令将不重复的列表数据写⼊到临时表#T m p中,然后删除原来的表,再将临时表中的数据写⼊到t a b l e N a m e中,最后删除临时表。
但是这种⽅法执⾏效率是⼀个⽅⾯,另外如果数据库中有t e x t类型的字段的话将不能执⾏,⾮常的有局限性。
下⾯提供⼀个通⽤的⽅法并且执⾏效率也是⾮常不错的,教本如下:
下载:c l e a n R e p e a t e d R o w s2.s q l
d e c l a r e@m a x i n t,@r o w n a m e v a r c h a r(400)
d e c l a r e c u r_r o w s c u r s o r l o c a l f o r
s e l e c t r e p e a t e d r o w,c o u n t(*)f r o m t a b l e N a m e g r o u p b y r e p e a t e d r o w h a v i n g c o u n t(*)>1
o p e n c u r_r o w s
f e t c h c u r_r o w s i n t o@r o w n a m e,@m a x
财务交接单模板
w h i l e@@f e t c h_s t a t u s=0
b e g i n
s e l e c t@m a x=@m a x-1
s e t r o w c o u n t@m a x
d e l e t e f r o m t a b l e N a m e w h e r e r e p e a t e d r o w=@r o w n a m e
f e t c h c u r_r o w s i n t o@r o w n a m e,@m a x
e n d
c l o s e c u r_r o w s
s e t r o w c o u n t0简单说明⼀下:⾸先声明了两个变量,⼀个是记录重复的数量,另外⼀个是记录重复字段的值,变量的类型以及长度可根据你实际的字段进⾏定义;接下来声明⼀个游标,该游标主要是列出重复的数据以及重复的数量;然后打开游标并从中取出数据,其中“s e l e c t@m a x=@m a x-1”这句的意思是保留⼀条重复数据,剩下的逐⼀删除;最后关闭游标,搞定。
阳光正好的唯美句子执⾏完教本之后可以使⽤下⾯的教本检查是否含有重复的数据:
s e l e c t r e p e a t e d r o w,c o u n t(*)f r o m t a b l e N a m e g r o u p b y r e p e a t e d r o w h a v i n g c o u n t(*)>1
《⼆》
数据库的使⽤过程中由于程序⽅⾯的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
⽅法⼀
declare @max integer,@id integer
declare cur_rows cursor local for lect 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
lect @max = @max -1
t rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
clo cur_rows
t rowcount 0
⽅法⼆
有两个意义上的重复记录,⼀是完全重复的记录,也即所有字段均重复的记录,⼆是部分关键字段重复的记录,⽐如Name字段重复,⽽其他字段不⼀定重复或都重复可以忽略。
1、对于第⼀种重复,⽐较容易解决,使⽤
lect distinct * from tableName
就可以得到⽆重复记录的结果集。
什么像什么一样如果该表需要删除重复的记录(重复记录保留1条),可以按以下⽅法删除
lect distinct * into #Tmp from tableName
drop table tableName
lect * into tableName from #Tmp
drop table #Tmp
发⽣这种重复的原因是表设计不周产⽣的,增加唯⼀索引列即可解决。本人简历怎么写
2、这类重复问题通常要求保留重复记录中的第⼀条记录,操作⽅法如下
假设有重复的字段为Name,Address,要求得到这两个字段唯⼀的结果集
lect identity(int,1,1) as autoID, * into #Tmp from tableName
lect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
lect * from #Tmp where autoID in(lect autoID from #tmp2)
最后⼀个lect即得到了Name,Address不重复的结果集(但多了⼀个autoID字段,实际写时可以写在lect⼦句中省去此列)
删除数据的⽅法:
如果你的硬盘空间⼩,并且不想设置数据库的⽇志为最⼩(因为希望其他正常的⽇志希望仍然记录),⽽且对速度要求⽐较⾼,并清除所有数据的建议你⽤turncate table1,因为truncate 是DDL操作,不产⽣rollback,不写⽇志速度快⼀些,然后如果有⾃增的话,恢复到1开始,⽽delete会产⽣rollback,如果删除⼤数据量的表速度会很慢,同时会占⽤很多的rollback gments,同时还要记录下G级别的⽇志;当然如果有条件删除⽐如where time<'2006-3-10' 怎么办,能不能不记录⽇志⽤delete,回答是不⾏的,SQLServer引擎在设计上就会对Delete操作进⾏⽇志记录。⾄今没有办法强制制定某⼀些语句不记录到⽇志中,如果在执⾏DeleteTable1whereTime<'2006-3-10'由于涉及的记录⽐较多,所以⽇志记录也相应很⼤(3-4G),如果可⾏,我建议⽤以下⽅式:
选出您所需要保留的记录到新的表。如果您使⽤FullRecoveryMode
根据SELECTINTO的记录数,⽇志可能会⽐较⼤
Select*intoTable2FromTable1WhereTime>='2006-03-10'全力以赴近义词
然后直接TruncateTable1。⽆论何种恢复模式都不会进⾏⽇志记录TruncatetableTable1
最后对Table2进⾏改名为Table1
ECsp_rename'Table2','Table1'
常⽤语句:
1、清空⽇志
青菜炒肉的做法DUMP TRANSACTION 库名 WITH NO_LOG
2、截断事务⽇志
BACKUP LOG 数据库名 WITH NO_LOG
易维适
3、收缩数据库
DBCC SHRINKDATABASE(客户资料)
4、删除整个表
DROP TABLE mytable
5、删除表中所有记录
DELETE FROM mytable
6、删除所有表的数所有数据,保留结构、对象等的⽅法,标识列ID从0开始。 TRUNCATE TABLE mytable
>理想的翅膀