首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server标识号不是连续的

Server标识号不是连续的
EN

Stack Overflow用户
提问于 2021-05-20 04:27:09
回答 3查看 297关注 0票数 0

我正在为每一行创建一个具有索引号(CustRef)的数据库表。

索引从1开始,每一行增加1。查询语言如下:

代码语言:javascript
复制
CREATE TABLE [dbo].[CustDetails]
(
    [CustRef] [int] IDENTITY(1,1) NOT NULL,
    [LName] [nchar](25) NOT NULL,
    [FName] [nchar](25) NOT NULL,
    [Address] [nchar](80) NULL,
    [Suburb] [nchar](25) NULL,
    [State] [nchar](5) NULL,
    [PCode] [nchar](5) NULL,

    CONSTRAINT [PK_CustDetails] 
        PRIMARY KEY CLUSTERED ([CustRef] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

该表是成功创建的,我正在通过插入一些示例数据来测试它。在一个阶段,我删除了一个行,它的索引号(CustRef)为6。在删除了索引6行之后,继续插入示例数据。

不幸的是,索引号不是连续的。换句话说,我期望新的数据内容将使用索引6作为其行索引号。但是,新条目跳过索引6,它从索引7开始。

从上面的屏幕截图中可以看到,在索引5和7之间,缺少索引6。

如何解决这一问题?提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-20 11:38:45

代码语言:javascript
复制
1. Create the table

 CREATE TABLE [dbo].[CustDetails]
 (
 [CustRef] [int] IDENTITY(1,1) NOT NULL,
 [LName] [nchar](25) NOT NULL,
 [FName] [nchar](25) NOT NULL,
 [Address] [nchar](80) NULL,
 [Suburb] [nchar](25) NULL,
 [State] [nchar](5) NULL,
 [PCode] [nchar](5) NULL,


 ) 
GO

  1. 插入记录

  1. 删除了最后一条记录。就我而言,这是第四项纪录。

  1. 集合标识插入到

将IDENTITY_INSERT dbo.CustDetails设为ON;

  1. 插入了包含标识列的记录。

插入DBO.CustDetails值(4,'test4','test','test')

这种方法有利于测试。但通常情况下,除非截断表,否则索引将不会在SQL server中的标识列中重置,因为它已经被分配。所以这是一种解决方案。使用标识插入,您可以获得行计数,并且根据最大(行计数),您可以在插入记录时设置标识列值。

票数 1
EN

Stack Overflow用户

发布于 2021-05-20 04:44:25

如果不是这样的话,你就会遇到这样的情况:

代码语言:javascript
复制
insert custRef ...; // id = 1
insert custRef ...; // id = 2

insert custRef (fName, lName)
values ('Jane', 'Goodall'); 
// id = 3

简·古德尔!她应该得到奖品。

代码语言:javascript
复制
declare @giveAPrizeTo int = (
    select   id 
    from     custRef 
    where    fname = 'Jane'
    and      lname = 'Goodall'
);

我们很快就会送过去的。

但首先,另一项任务。无法联系到的客户并不是真正有用的。老板要求我们把桌子保持干净。

代码语言:javascript
复制
delete custRef where address is null;
alter table custRef alter column address nchar(80) not null;

好吧,好吧,继续,加入下一个人。

代码语言:javascript
复制
insert custRef (fName, lName, address)
values ('Jeffrey', 'Dahmer', '1234 W Somewhere; Milwaukee, Wisconsin 12345');

在这个假设的方言中,id的循环,Jeffrey现在有id= 3。

嗯,这很有趣。我应该小心最新的顾客。嗯,我分心了,我在做什么?哦,是的,那个奖品!我最好送过去。

代码语言:javascript
复制
declare @message nvarchar(max) = (

    select    'Congratulations ' + fName + ' ' + lName ', ' + 
              'we support your good works.  Have a prize!' 
    from      custRef
    where     id = @giveAPrizeTo;

);

print (@message);

祝贺杰弗里·达默,我们支持你的好作品。拿个奖!

糟了!

票数 1
EN

Stack Overflow用户

发布于 2021-05-20 06:31:35

在表CustDetails列中,CustRef是标识列。它的自动增量为1,2,3,4,5,6,现在您删除了最后一行,即从CustDetails中删除CustRef=6。从技术上讲,下一行将被插入7,因为SQL已经将值6赋值给上一行。在其他场景中,如果您输入了最多1,2,3,4,5,6,7,8,9,现在删除了第6行。根据你的要求,你期望下一个价值是多少? 10还是6?

当客户要求只删除最后一行而不跳过数字时,我实现了逻辑,我为下一行编写了一个maxvalue +1的逻辑。您可以在插入时以删除标识和最大(CustRef)+1的形式写入。或者,您可以在每次删除后重新启动dbcc,这样就可以编写

代码语言:javascript
复制
declare @id int = 0
SELECT @id =  MAX(CustRef) FROM CustDetails
DBCC CHECKIDENT ('dbo.CustDetails', reseed, @id)

这将告诉sql将值重置为最后一个最大值。这根本不是推荐的方法。这只是一个选项,但是是的,您可以在insert语句之前为get (CustRef)选择remove和写逻辑,然后增加它并插入到CustDetails表中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67613999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档