柔情似水 发表于 2015-1-16 14:09:00

使用SQL语句重置数据库中一切表的标识列(自增量)

索引是一种特殊的文件(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语句,只是包含了将数据恢复的操作。

因胸联盟 发表于 2015-1-18 12:10:00

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。

灵魂腐蚀 发表于 2015-1-26 12:50:43

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

山那边是海 发表于 2015-2-4 18:35:17

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。

莫相离 发表于 2015-2-10 05:44:02

groupby子句可以将查询结果分组,并返回行的汇总信息Oracle按照groupby子句中指定的表达式的值分组查询结果。

简单生活 发表于 2015-2-28 23:01:25

如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。

愤怒的大鸟 发表于 2015-3-10 10:43:54

是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。

再见西城 发表于 2015-3-17 06:49:32

每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。

小妖女 发表于 2015-3-24 01:18:47

记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
页: [1]
查看完整版本: 使用SQL语句重置数据库中一切表的标识列(自增量)