仓酷云

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

[学习教程] 使用SQL语句重置数据库中一切表的标识列(自增量)

[复制链接]
柔情似水 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:09:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

x
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。在外实行的时分,常常必要为用户清空一切表中的数据,数据清空后,最好是可以让表中的标识列从1入手下手记数,以是要重置标识列确当前值。我们能够使用dbcccheckident来重置表的标识列,但一次只能重置一个表的标识列,地点就想到了游标,我们能够使用游标来轮回实行dbcccheckident语句,如许就能够重置数据库中一切表的标识列了。

关于dbcccheckident的用法,能够参考本站:
重置SqlServer表的自增列,让自增列从头入手下手记数

在这之前,我们起首要猎取两个信息:
1,猎取到数据库中一切表信息,这个能够用select*fromsys.tables来完成。
2,要判别表中是不是有标识列,能够用以下sql来查询:
select*fromsys.columnswhereis_identity=1andobject_id=object_id(表名)

关于怎样猎取到数据库一切表的更多办法,请检察本站:
使用SQL语句查询数据库中一切表

失掉需要的两个信息后,我们就能够写游标来重置数据库中一切表的标识列了,sql以下:
declare@tablenamevarchar(50)
declare@sqlvarchar(1000)

declarecurcursorforselectnamefromsys.tables
opencur
fetchnextfromcurinto@tablename
while@@fetch_status=0
begin

set@sql=if(selectcount(1)from+@tablename+)<=0andexists(select*fromsys.columnswhereis_identity=1andobject_id=object_id(+@tablename+))
begin
dbcccheckident(+@tablename+,reseed,1)
end

exec(@sql)

fetchnextfromcurinto@tablename
end
closecur
deallocatecur


但愿以上办法能给人人带来便当。因此我们的方案中要构造这种逆操作。Event_type增加一种FlashBACK_EVENT。这类操作形式与Query_Event相同,都是简单的SQL语句,只是包含了将数据恢复的操作。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-15 09:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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