查找SQL Server 自增ID值不连续记录

在很多的时候,我们会在数据库的表中设置一个字段:ID,这个ID是一个IDENTITY,也就是说这是一个自增ID。当并发量很大并且这个字段不是主键的时候,就有可能会让这个值重复;或者在某些情况(例如插入数据的时候出错,或者是用户使用了Delete删除了记录)下会让ID值不是连续的,比如1,2,3,5,6,7,10,那么在中间就断了几个数据,那么我们希望能在数据中找出这些相关的记录,我希望找出的记录是3,5,7,10,通过这些记录可以查看这些记录的规律来分析或者统计;又或者我需要知道那些ID值是没有的:4,8,9。

解决办法的核心思想是: 获取到当前记录的下一条记录的ID值,再判断这两个ID值是否差值为1,如果不为1那就表示数据不连续了

执行下面的语句生成测试表和测试记录

 1 --生成测试数据
 2 if exists (select * from sysobjects where id = OBJECT_ID(‘[t_IDNotContinuous]‘) and OBJECTPROPERTY(id, ‘IsUserTable‘) = 1)
 3 DROP TABLE [t_IDNotContinuous]
 4
 5 CREATE TABLE [t_IDNotContinuous] (
 6 [ID] [int]  IDENTITY (1, 1)  NOT NULL,
 7 [ValuesString] [nchar]  (10) NULL)
 8
 9 SET IDENTITY_INSERT [t_IDNotContinuous] ON
10
11 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 1,‘test‘)
12 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 2,‘test‘)
13 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 3,‘test‘)
14 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 5,‘test‘)
15 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 6,‘test‘)
16 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 7,‘test‘)
17 INSERT [t_IDNotContinuous] ([ID],[ValuesString]) VALUES ( 10,‘test‘)
18
19 SET IDENTITY_INSERT [t_IDNotContinuous] OFF
20
21 select * from [t_IDNotContinuous]

(图1:测试表)

 1 --拿到当前记录的下一个记录进行连接
 2 select ID,new_ID
 3 into [t_IDNotContinuous_temp]
 4 from (
 5 select ID,new_ID = (
 6 select top 1 ID from [t_IDNotContinuous]
 7 where ID=(select min(ID) from [t_IDNotContinuous] where ID>a.ID)
 8 )
 9 from [t_IDNotContinuous] as a
10 ) as b
11
12 select * from [t_IDNotContinuous_temp]

(图2:错位记录)

 1 --不连续的前前后后记录
 2 select *
 3 from [t_IDNotContinuous_temp]
 4 where ID <> new_ID - 1
 5
 6
 7 --查询原始记录
 8 select a.* from [t_IDNotContinuous] as a
 9 inner join (select *
10 from [t_IDNotContinuous_temp]
11 where ID <> new_ID - 1) as b
12 on a.ID >= b.ID and a.ID <=b.new_ID
13 order by a.ID

(图3:效果)

补充1:如果这个ID字段不是主键,那么就会有ID值重复的情况(有可能是一些误操作,之前就有遇到过)那么就需要top 1来处理。但是当前这种情况下可以使用下面的简化语句

1 select a.id as oid, nid =
2 (select min(id) from t_IDNotContinuous b where b.id > a.id)
3 from t_IDNotContinuous a

补充2:缺失ID值列表,

1--方法一:找出上一条记录+1,再比较大小
2 select (select max(id)+1
3 from [t_IDNotContinuous]
4 where id<a.id) as beginId,
5 (id-1) as endId
6 from [t_IDNotContinuous] a
7 where
8 a.id>(select max(id)+1 from [t_IDNotContinuous] where id<a.id)

(图4:效果)

1 --方法二:全部+1,再判断在原来记录中找不到
2 select beginId,
3 (select min(id)-1 from [t_IDNotContinuous] where id > beginId) as endId
4 from (
5 select id+1 as beginId from [t_IDNotContinuous]
6 where id+1 not in
7 (select id from [t_IDNotContinuous])
8 and id < (select max(id) from [t_IDNotContinuous])
9 ) as t
时间: 2024-10-18 03:38:59

查找SQL Server 自增ID值不连续记录的相关文章

SQL Server 强行Insert包含自增列值的记录

SET IDENTITY_INSERT 表 ON INSERT INTO 表 ([ID] ,[SequenceNumber] ,[EnumCode] ,[Description]) VALUES (6 ,1 ,'Empty' ,'Empty') SET IDENTITY_INSERT 表 OFF 此处ID为自增列 SQL Server 强行Insert包含自增列值的记录,布布扣,bubuko.com

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

Windows Server 2012搭建SQL Server Always On踩坑全记录

Windows Server 2012搭建SQL Server Always On踩坑全记录 环境信息: Windows Server 2012 R2 Sql Server 2012 整个搭建集群的过程主要分为3步: 1.配置预控,并把机器加域. 2.配置windows故障转移集群(Windows Failover Cluster) 3.配置SQL Server Always On High Availability Group(AG) 踩坑全记录 预控配置 比较好配置,需要注意的是非预控机器在

sql server 自增列,值突然增大1000的情况

解决方法: 1 打开配置管理器2左面点击sql服务3右面 右键点击SQL Server(MSSQLSERVER) 4点击 启动参数5 在参数 里输入  -T272 点增加 原文地址:https://www.cnblogs.com/superfeeling/p/11774417.html

MySQL获得指定数据表中auto_increment自增id值的方法及实例

http://kb.cnblogs.com/a/2357592/很多情况下,我们要提前用到当前某个表的auto_increment自增列id,可以通过执行sql语句来查询到这个id值. show table status where name=’表名’ 或者 show table status like ‘表名’ 然后从查询到的结果集中获得auto_increment的值 代码实例:<?php mysql_connect("localhost","root",

Entity Framework添加记录时获取自增ID值

var m = new 你的Model(); db.你的Model.add(m); db.SaveChange(); Response.Write(m.Id); //执行.SaveChange()保存后就直接可以取得id值了. 保存前没有id值. Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增值返回给实体对象对应的属性. 比如下面添加博客随笔至数据库的示例代码: var blogPost = new BlogPost() { Author = "博客园

13 三种方式替换SQL Server中的NULL值(Different ways to replace NULL in Sql Server)

在Sql Server中有三种方式对查询结果中的NULL值进行替换. 如有下面的一张表: 我们可以通过自连接(Self-Join)的方式一张员工名和其对应的经理名的表: SELECT E.[Name],M.[Name] FROM [tblEmployee] AS E LEFT JOIN [tblEmployee] AS M ON E.ManagerId = M.EmployeeId 我们可以看到,Todd对应的Manger为NULL,这说明Todd应该是公司的最高层,他没有经理.但是这样显示很不

安装SQL Server出现未能将值CLSID写入项\Software\Classes\PROTOCOLS\Handler\ms-help的错误

在安装SQL Server会出现一个未能将值CLSID写入项\Software\Classes\PROTOCOLS\Handler\ms-help的错误. 解决方案: 运行输入Regedit 把HKEY_LOCAL_MACHINE\Software\Classes右键权限加上system用户并赋予完全控制权限,如图: 保存确定重新安装SQL就可以了.

sql server判断是否重复值

一个字符串为"1:2:1:1:1". 请问: 如何在SQL SERVER中实现如下功能: 1.判断该字符串中是否存在重复的数字 如果存在重复的数字,返回错误信息 如果不存在重复的数字,返回正确. 思路:分割字符串,将子字符串存入临时表,在临时表进行分组判断 create function RepeatString(@input varchar(8000),@separator varchar(10)) returns int as begin declare @temp table(p