|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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个。 |
|