仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 961|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之在SQL Server中疾速删除反复纪录

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:38:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
mysql使用内部操作字符集gbk来进行操作,即执行"SELECT*FROMtestWHEREname=xxxor1=1/*LIMIT1";从而注入成功server|反复|反复纪录  开辟职员的恶梦——删除反复纪录

  想必每位开辟职员都有过相似的履历,在对数据库举行查询或统计的时分不时地会碰着因为表中存在反复的纪录而招致查询和统计了局禁绝确。办理该成绩的举措就是将这些反复的纪录删除,只保存个中的一条。

  在SQLServer中除对具有十几笔记录的表举行野生删除外,完成删除反复纪录一样平常都是写一段代码,用游标的办法一行一行反省,删除反复的纪录。由于这类办法必要对全部表举行遍历,以是关于表中的纪录数不是很年夜的时分仍是可行的,假如一张表的数据到达上百万条,用游标的办法来删除几乎是个恶梦,由于它会实行相称长的一段工夫。

  四板斧——轻松打消反复纪录

  却不知在SQLServer中有一种更加复杂的办法,它不必要用游标,只需写一句复杂拔出语句就可以完成删除反复纪录的功效。为了能分明地表述,我们起首假定存在一个产物信息表Products,其表布局以下:

CREATETABLEProducts(
ProductIDint,
ProductNamenvarchar(40),
Unitchar(2),
UnitPricemoney
)
  表中的数据如:


  中能够看出,产物Chang和Tofu的纪录在产物信息表中存在反复。如今要删除这些反复的纪录,只保存个中的一条。步骤以下:

  第一板斧——创建一张具有不异布局的一时表

CREATETABLEProducts_temp(
ProductIDint,
ProductNamenvarchar(40),
Unitchar(2),
UnitPricemoney
)
  第二板斧——为该表加上索引,并使其疏忽反复的值

  办法是在企业办理器中找到下面创建的一时表Products_temp,单击鼠标右键,选择一切义务,选择办理索引,选择新建。如所示。

  依照中圈出来的中央设置索引选项。


  第三板斧——拷贝产物信息光临时表

insertintoProducts_tempSelect*fromProducts
  此时SQLServer会前往以下提醒:

  服务器:动静3604,级别16,形态1,行1

  已疏忽反复的键。

  它标明在产物信息一时表Products_temp中不会有反复的行呈现。

  第四板斧——将新的数据导进原表

  将原产物信息表Products清空,并将一时表Products_temp中数据导进,最初删除一时表Products_temp。

deleteProducts
insertintoProductsselect*fromProducts_temp
droptableProducts_temp
  如许就完成了对表中反复纪录的删除。不管表有多年夜,它的实行速率都是相称快的,并且由于几近不必写语句,以是它也是很平安的。

  小提醒:上述办法中删除反复纪录取决于创立独一索引时选择的字段,在实践的操纵过程当中读者务必起首确认创立的独一索引字段是不是准确,以避免将有效的数据删除。
从理论上讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL把同一个数据表里的索引总数限制为16个。
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-19 20:06:30 来自手机 | 只看该作者
发几份SQL课件,以飨阅者
乐观 该用户已被删除
板凳
发表于 2015-1-27 08:37:39 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
只想知道 该用户已被删除
地板
发表于 2015-2-5 05:36:03 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
飘灵儿 该用户已被删除
5#
发表于 2015-2-11 06:26:27 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
简单生活 该用户已被删除
6#
发表于 2015-3-1 23:06:34 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
小妖女 该用户已被删除
7#
发表于 2015-3-11 00:48:12 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
变相怪杰 该用户已被删除
8#
发表于 2015-3-17 17:09:58 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
9#
发表于 2015-3-24 14:36:50 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 17:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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