zoukankan      html  css  js  c++  java
  • 小毛病,大问题

    今天用户抱怨,为什么数据库中条目的计数越来越大,而且清空数据库后重新计数,还是变大?

    其实这是我在设计的时候懒惰造成的,产品使用的是SQLServer数据库,数据库的字段ID是标识列,是自增的,当时没有考虑ID变大的情况,所以就任由着字段编号无限的变大,也没有注意,当用户抱怨的时候,也没太当回事,因为程序没有什么错误呀.

    其实这是一个不好的用户体验,而我们完全可以解决,其实在删除数据或全部删除数据的时候,增加一个校验,如果数据库中记录数目为0,那么就重新设置标识列的计数,也就很简单了,其实我们真的不应该忽视任何细节,就是一个简单的删除记录/清空表,其实都大有学问的.

    在SQLServer中的解决方法如下:

    DBCC CHECKIDENT
    检查指定表的当前标识值,如有必要,还对标识值进行更正。

    举例:
    DBCC CHECKIDENT (TableName,  RESEED, 1)

    强制表中的当前标识值为 1。

    另外一条需要注意的语句是

    TRUNCATE TABLE
    删除表中的所有行,而不记录单个行删除操作。

    DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

    TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

    若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速、无日志记录的方法。该语句总是比不带条件的 DELETE 语句要快,因为 DELETE 语句要记录对每行的删除操作,而 TRUNCATE TABLE 语句只记录整个数据页的释放。TRUNCATE TABLE 语句立即释放由该表的数据和索引占用的所有空间。所有索引的分发页也将释放。

    与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义,同其索引和其它相关的对象一起仍保留在数据库中。必须使用 DROP TABLE 语句才能除去表的定义。

    呵呵,有些时候看帮助就是不认真,往往几句话,能够对程序性能和效果有很大的改变.
  • 相关阅读:
    第一次个人作业-热身
    OO总结
    oo第三单元总结
    oo第二单元总结
    软件工程 —— 课程回顾与个人总结
    BUAA软件案例分析——智能表单抽取识别
    软件工程—结对项目博客
    轨迹预测文献阅读整理(轨迹多样性、车辆轨迹、图神经网络、潜码)
    软件工程
    软件工程
  • 原文地址:https://www.cnblogs.com/Duiker/p/283417.html
Copyright © 2011-2022 走看看