广告
返回顶部
首页 > 资讯 > 数据库 >SQL 基础知识 -- identify seed overflow
  • 865
分享到

SQL 基础知识 -- identify seed overflow

2024-04-02 19:04:59 865人浏览 八月长安
摘要

DBCC CHECKIDENT (Transact-SQL)Checks the current identity value for the specified table in SQL Server 2

DBCC CHECKIDENT (Transact-SQL)

Checks the current identity value for the specified table in SQL Server 2016 and, if it is needed, changes the identity value. You can also use DBCC CHECKIDENT to manually set a new current identity value for the identity column.


Permissions


Caller must own the schema that contains the table, or be a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

Examples


A. Resetting the current identity value, if it is needed

The following example resets the current identity value, if it is needed, of the specified table in the AdventureWorks2012 database.


USE AdventureWorks2012;  
Go  
DBCC CHECKIDENT ('Person.AddressType');  
GO

B. Reporting the current identity value

The following example reports the current identity value in the specified table in the AdventureWorks2012 database, and does not correct the identity value if it is incorrect.


USE AdventureWorks2012;   
GO  
DBCC CHECKIDENT ('Person.AddressType', NORESEED);   
GO

C. Forcing the current identity value to a new value

The following example forces the current identity value in the AddressTypeID column in the AddressType table to a value of 10. Because the table has existing rows, the next row inserted will use 11 as the value, that is, the new current increment value defined for the column value plus 1.


USE AdventureWorks2012; 
GO 
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10); 
GO 


SQL 基础知识 -- identify seed overflow

https://msdn.microsoft.com/en-IN/library/ms176057.aspx 


SQL Server 重置Identity标识列的值(INT爆了)

Http://www.cnblogs.com/gaizai/arcHive/2013/04/23/3038318.html

一、背景

  sql Server数据库中表A中Id字段的定义是:[Id] [int] IDENTITY(1,1),随着数据的不断增长,Id值已经接近2147483647(int的取值范围为:-2 147 483 648 到 2 147 483 647)了,虽然已经对旧数据进行归档,但是这个表需要保留最近的1亿数据,有什么方法解决Id值就快爆的问题呢?

  解决上面的问题有两个办法:一个是修改表结构,把Id的int数据类型修改为bigint;第二个是重置Id(Identity标识列)的值,使它重新增长。

  当前标识值:current identity value,用于记录和保存最后一次系统分配的Id值;下次分配Id就是:当前标识值+标识增量(通常为+1,也可以自行设置);

  当前列值:current column value,这Id值到目前为止的最大值;

 

二、重置过程

(一) 下面就测试重置Identity标识列,首先使用下面的SQL创建测试表:

SQL 基础知识 -- identify seed overflow

--创建测试表CREATE TABLE [dbo].[Test_Identity](    [IdentityId] [int] IDENTITY(1,1) NOT NULL,    [Name] [nchar](10) NULL, CONSTRAINT [PK_testid] PRIMARY KEY CLUSTERED (    [IdentityId] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

SQL 基础知识 -- identify seed overflow

(二) 显示插入Id值,插入后表[Test_Identity]的记录如Figure1所示,接着再隐式插入Id值,插入后表[Test_Identity]的记录如Figure2所示。

SQL 基础知识 -- identify seed overflow

--显示插入Id值SET IDENTITY_INSERT [Test_Identity] ONINSERT INTO [Test_Identity](IdentityId,Name)SELECT 1000,'name1'SET IDENTITY_INSERT [Test_Identity] OFF--隐式插入Id值INSERT INTO [Test_Identity](Name)SELECT 'name2'

SQL 基础知识 -- identify seed overflow

SQL 基础知识 -- identify seed overflow

(Figure1:数据记录)

SQL 基础知识 -- identify seed overflow

(Figure2:数据记录)

(三) DBCC CHECKIDENT('table_name', NORESEED)不重置当前标识值。DBCC CHECKIDENT 返回一个报表,它指明当前标识值和应有的标识值。执行下面的SQL语句,返回的信息表示:当前标识值'1001',当前列值'1001',如Figure2所示。

SQL 基础知识 -- identify seed overflow

--查询标识值DBCC CHECKIDENT('Test_Identity', NORESEED)

SQL 基础知识 -- identify seed overflow

(四) 再隐式插入Id值,插入后表[Test_Identity]的记录如Figure3所示。所以执行上面的SQL语句是不会重置当前标识值的,可以放心执行。

--隐式插入Id值INSERT INTO [Test_Identity](Name)SELECT 'name3'

SQL 基础知识 -- identify seed overflow

(Figure3:数据记录)

SQL 基础知识 -- identify seed overflow

--查询标识值DBCC CHECKIDENT('Test_Identity', NORESEED)

SQL 基础知识 -- identify seed overflow

(五) DBCC CHECKIDENT ('table_name') 或DBCC CHECKIDENT ('table_name', RESEED) 如果表的当前标识值小于列中存储的最大标识值,则使用标识列中的最大值对其进行重置。

因为上面返回结果是:当前标识值'1002',当前列值'1002',所以执行下面的SQL语句是没有影响的,什么时候才有影响呢?参考:(当在Figure4状态下执行下面的SQL命令,结果就会如Figure7所示

SQL 基础知识 -- identify seed overflow

--重置标识值DBCC CHECKIDENT('Test_Identity', RESEED)

SQL 基础知识 -- identify seed overflow

(六) DBCC CHECKIDENT('table_name', RESEED, new_reseed_value)当前值设置为 new_reseed_value。如果自创建表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value 作为标识。否则,下一个插入的行将使用 new_reseed_value + 1。如果 new_reseed_value 的值小于标识列中的最大值,以后引用该表时将产生 2627 号错误信息。

要理解上面的描述,可以进行下面的测试:

1) 重新设置当前值设置为new_reseed_value = 995,执行下面的SQL语句返回的信息如下所示;

SQL 基础知识 -- identify seed overflow

--重置标识值DBCC CHECKIDENT('Test_Identity', RESEED, 995)

SQL 基础知识 -- identify seed overflow

2) 继续往[Test_Identity]表插入数据,执行下面的SQL语句插入后的结果如Figure4所示;插入的Id值为new_reseed_value + 1 = 996;

--隐式插入Id值INSERT INTO [Test_Identity](Name)SELECT 'name4'

SQL 基础知识 -- identify seed overflow

(Figure4:数据记录)

3) 查看现在的标识值,与上面的进行对比,你就可以理解【当前标识值】与【当前列值】的意义了;

SQL 基础知识 -- identify seed overflow

--查询标识值DBCC CHECKIDENT('Test_Identity', NORESEED)

SQL 基础知识 -- identify seed overflow

4) 继续往[Test_Identity]表插入数据,执行3次后表的数据如Figure5所示;

--隐式插入Id值INSERT INTO [Test_Identity](Name)SELECT 'name5'

SQL 基础知识 -- identify seed overflow

(Figure5:数据记录)

5) 如果现在继续往[Test_Identity]表插入数据会发生什么事情呢?将产生 2627 号错误信息,如下面的错误信息;

消息2627,级别14,状态1,第2 行

违反了PRIMARY KEY 约束'PK_testid'。不能在对象'dbo.Test_Identity' 中插入重复键。

语句已终止。

6) 下面来测试创建表后没有插入行,如果这个时候执行重置标识值会发生什么事情?清空[Test_Identity]表,再重新设置标识值,返回的信息如下面所示;

SQL 基础知识 -- identify seed overflow

--清空表truncate table [Test_Identity]--重置标识值DBCC CHECKIDENT('Test_Identity', RESEED, 995)

SQL 基础知识 -- identify seed overflow

7) 这个时候往[Test_Identity]表插入数据,数据就如Figure6所示,这说明了:“如果自创建表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value 作为标识。

--隐式插入Id值INSERT INTO [Test_Identity](Name)SELECT 'name5'

SQL 基础知识 -- identify seed overflow

(Figure6:数据记录)

SQL 基础知识 -- identify seed overflow

(Figure7:数据记录)

8) 假如我们删除了IdentityId为1000和1001的记录,这个时候继续插入数据,会重新生成1000和10001值吗?效果如Figure10所示(重新覆盖了);

--删除和delete from [Test_Identity] where IdentityId=1000delete from [Test_Identity] where IdentityId=1001

SQL 基础知识 -- identify seed overflow

(Figure8:数据记录)

--重置标识值DBCC CHECKIDENT('Test_Identity', RESEED, 996)--隐式插入Id值INSERT INTO [Test_Identity](Name)SELECT 'name6'

SQL 基础知识 -- identify seed overflow

(Figure9:数据记录)

SQL 基础知识 -- identify seed overflow

(Figure10:数据记录)

(七) 总结:到这里,我们已经可以解决Id值就快爆的问题了,因为我们旧的数据会定时归档,所以不会出现2627错误信息;而另外一个场景是当出现Figure5的时候,可以执行DBCC CHECKIDENT('Test_Identity', RESEED),设置为当前列最大值为标识值,防止出现2627错误信息。

 

三、补充说明

Mysql中,也有类似Identity的功能:

`IDs` int(11) unsigned NOT NULL AUTO_INCREMENT

在创建表的时候,会有一个选项AUTO_INCREMENT=17422061,直接可以设置起始值,还可以设置步长:

SHOW VARIABLES LIKE 'auto_inc%';

起始值:auto_increment_offset

步长:auto_increment_increment

SET @auto_increment_increment=10;

SELECT LAST_INSERT_ID();

 


您可能感兴趣的文档:

--结束END--

本文标题: SQL 基础知识 -- identify seed overflow

本文链接: https://www.lsjlt.com/news/34562.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL 基础知识 -- identify seed overflow
    DBCC CHECKIDENT (Transact-SQL)Checks the current identity value for the specified table in SQL Server 2...
    99+
    2022-10-18
  • sql注入基础知识的介绍
    本篇内容介绍了“sql注入基础知识的介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是SQL注入(S...
    99+
    2022-10-18
  • python基础知识
    1.注释   1.1.单行注释:以#开头,#右边的有所东西当做说明.   1.2.多行注释:'''   我是多行注释   '''   2.变量   2.1.为了充分的利用内存空间以及更有效率的管理内存,变量是有不同类型的     2.1....
    99+
    2023-01-30
    基础知识 python
  • MySQL基础知识
    1、MySQL查询 union和union all的区别: union和union all都可以将两边的查询结果合并,区别在于union的合并会去掉重复行,并且使用默认的排序规则。而un...
    99+
    2022-01-06
    MySQL基础知识
  • nodejs基础知识
    什么是nodejs? node.js是基于Chrome javaScript运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。(但nodejs不是javascript应用,nodejs...
    99+
    2022-06-04
    基础知识 nodejs
  • MHA基础知识
    环境: ...
    99+
    2022-10-18
  • Oracle基础知识
    1、Oracle分页查询 现有表employee_tbl,要求按年龄降序,分页查询数据,每页3条数据。 ID  NAME         DATE                             SIGNIN   AGE 1 ...
    99+
    2018-10-23
    Oracle基础知识
  • MongoDB基础知识
    NoSQL是什么?   非关系型数据库,有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称 NoSQL的优势  &...
    99+
    2022-10-18
  • Python 基础知识
    只是打印出 hello world 肯定是不够的,是吗?你会希望做得比这还要多——你想要输入一些内容,操纵它,然后从中得到一些输出出来的内容。我们可以在 Python 中通过使用变量与常量来实现这一目标,在本章中我们还会学习其它的一些概...
    99+
    2023-01-31
    基础知识 Python
  • python3基础知识
    字符串截取:利用下标进行截取py_str = 'python'len(py_str)py_str[:3] py_str + '123''python123'py_str * 3'pythonpythonpython' Str将数...
    99+
    2023-01-31
    基础知识
  • 基础知识—3.12
    1、二叉树: 结点:所有的叶子。 叶子结点:最后一层的叶子数。 性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。性质3:包含n个结点的二叉树的高度至少为log2...
    99+
    2023-01-30
    基础知识
  • RabbitMQ的基础知识
    目录RabbitMQ1.对MQ的介绍2.RabbitMQ的六种模式 及工作原理3.hello world队列4.工作队列模式5.消息应答机制自动应答手动应答消息自动进行重新入队6.R...
    99+
    2022-11-12
  • 一、PyQt基础知识
    一、基础知识 (一)简介 1. 什么是PyQt5 PyQt是基于Digia公司强大的图形程序框架Qt的Python接口,由一组Python模块构成,它是一个创建GUI应用程序的工具包,由Phil Th...
    99+
    2023-09-11
    pyqt qt python
  • python之基础知识
    1、变量: 2、字符串:用   “  ” 或 ' ' 标注的。 3、列表:[  ] 4、del 和 pop 的区别: 判断何时使用:当从列表中删除元素后不再使用,则del,若后续还使用则pop() 例: #del name =["lele...
    99+
    2023-01-30
    基础知识 python
  • 1、LDAP基础知识
    1、概念:目录服务是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事...
    99+
    2022-10-18
  • 【ASM】ASM基础知识
    【ASM】ASM基础知识 市场占有率 ASM自动存储管理技术已经面世10多个年头,目前已经广泛使用于各个领域的数据库存储解决...
    99+
    2022-10-18
  • MongoDB基础知识(一)
     互联网行业的发展非常的迅速,数据存储以及架构优化方面也有很多不同的解决方案,例如关系型数据库、非关系型数据库、数据仓库技术等。更多数据库类产品的出现,为我们很好的解决了数据存储的问题,例如Red...
    99+
    2022-10-18
  • redis的基础知识
    select切换数据库 remoteSelf:0>select 0 "OK" dbsize查看当前数据库的key数量 remoteSelf:0>dbsize "2" keys查看所有的key remoteSelf:0>keys ...
    99+
    2018-01-01
    redis的基础知识
  • Python基础知识(一)
      #Python中开始那个Hello World挺简单的。  #!user/bin/env python3  #这一行是shebang,用以指示用哪个解释器来执行,如果有的话,必须在程序第一行  print("Hello World!")...
    99+
    2023-01-31
    基础知识 Python
  • 【MySQL】基础知识(二)
    MySQL基础知识(二) 文章目录 MySQL基础知识(二)01 表操作1.1 创建表1.2 查看所有表1.3 查看指定表的结构1.4 删除表练习 02 CURD2.1 新增2.1.1 ...
    99+
    2023-09-06
    mysql adb android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作