zoukankan      html  css  js  c++  java
  • 可遇不可求的Question之重置SQLSERVER表的自增列标识值(Seed)篇

    1.truncate table tablename 当然前提是你必须要有这么高的权限.

    2.也必须要有极高的权限,"调用方必须是表所有者"

    --每次要删除表中的数据(delete from tableName),下次使用时,表中的自增ID就会从上次的ID依次递增。
    --只要在delete执行结束后,执行 dbcc checkident('tableName',reseed,0) 自增列即会从"1"开始。
    附:

    @@IDENTITY,SCOPE_IDENTITY,IDENT_CURRENT的区别
    @@IDENTITY--是得到当前会话的所有范围的最后插入的IDENTITY值
    SCOPE_IDENTITY --是得到当前会话的当前范围的最后插入的IDENTITY值
    IDENT_CURRENT --是得到指定表的最后插入的IDENTITY值,与会话、范围无关。

    检查指定表的当前标识值,如有必要,则更改标识值。还可以使用 DBCC CHECKIDENT 为标识列手动设置新的种子值。

    Transact-SQL 语法约定

    语法

    DBCC CHECKIDENT 
    ( 
            'table_name'
            [ , { NORESEED | { RESEED [ , new_reseed_value ] } } ]
    )
    [ WITH NO_INFOMSGS ]

    参数

    'table_name'

    是要对其当前标识值进行检查的表名。指定的表必须包含标识列。表名必须符合标识符规则。

    NORESEED

    指定不应更改当前标识值。

    RESEED

    指定应该更改当前标识值。

    new_reseed_value

    在标识列中重新赋值时要使用的新种子值。

    WITH NO_INFOMSGS

    取消显示所有信息性消息。

    结果集

    无论是否为包含标识列的表指定了任何选项,DBCC CHECKIDENT 都返回以下信息(返回值可能有所不同):

    复制代码
    Checking identity information: current identity value '290', current column value '290'.
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.

    备注

    对当前标识值所做的具体更正取决于参数规范。

    DBCC CHECKIDENT 命令 标识更正或所做的更正

    DBCC CHECKIDENT ( 'table_name', NORESEED )

    不重置当前标识值。DBCC CHECKIDENT 将返回标识列的当前标识值和当前最大值。如果这两个值不相同,则应重置标识值,以避免值序列中的潜在错误或空白。

    DBCC CHECKIDENT ( 'table_name' )

    或者

    DBCC CHECKIDENT ( 'table_name', RESEED )

    如果表的当前标识值小于标识列中存储的最大标识值,则使用标识列中的最大值对其进行重置。

    DBCC CHECKIDENT ( 'table_name', RESEED, new_reseed_value )

    将当前标识值设置为 new_reseed_value。如果自创建表后没有在表中插入任何行,则在运行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value 作为标识。否则,插入的下一行将使用 new_reseed_value + 当前增量值。

    如果该表不为空,那么将标识值设置为小于标识列中的最大值的数字时,将会出现下列情况之一:

    • 如果标识列中存在 PRIMARY KEY 或 UNIQUE 约束,则随后在表中执行插入操作时将生成错误消息 2627,原因是生成的标识值将与现有值冲突。

    • 如果不存在 PRIMARY KEY 或 UNIQUE 约束,则随后的插入操作将产生重复的标识值。

    异常

    下表列出了 DBCC CHECKIDENT 不自动重置当前标识值时的条件,并提供了重置该值的方法。

    条件 重置方法

    当前标识值大于表中的最大值。

    • 执行 DBCC CHECKIDENT ('table_name', NORESEED) 以确定列中的当前最大值,然后在 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 命令中将该值指定为 new_reseed_value

    或者

    • 执行 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value),并将 new_reseed_value 设置为很小的值,然后运行 DBCC CHECKIDENT ('table_name', RESEED) 以更正该值。

    删除表中的所有行。

    执行 DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value),并将 new_reseed_value 设置为所需的起始值。

    权限

    调用方必须是表所有者,或是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。

  • 相关阅读:
    系统的讲解
    后端架构师技术图谱
    设计模式简介(45种)
    浅入浅出 Go 语言接口的原理
    我所认为的RESTful API最佳实践
    Mysql 索引精讲
    客户端与服务端的三次握手与四次挥手
    线程的安全和可重入(待续)
    进程和线程(待续)
    设计模式(3)--观察者模式(待续)
  • 原文地址:https://www.cnblogs.com/tigerjacky/p/2043148.html
Copyright © 2011-2022 走看看