我正在为每一行创建一个具有索引号(CustRef)的数据库表。
索引从1开始,每一行增加1。查询语言如下:
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。
如何解决这一问题?提前谢谢。
发布于 2021-05-20 11:38:45
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将IDENTITY_INSERT dbo.CustDetails设为ON;
插入DBO.CustDetails值(4,'test4','test','test')

这种方法有利于测试。但通常情况下,除非截断表,否则索引将不会在SQL server中的标识列中重置,因为它已经被分配。所以这是一种解决方案。使用标识插入,您可以获得行计数,并且根据最大(行计数),您可以在插入记录时设置标识列值。
发布于 2021-05-20 04:44:25
如果不是这样的话,你就会遇到这样的情况:
insert custRef ...; // id = 1
insert custRef ...; // id = 2
insert custRef (fName, lName)
values ('Jane', 'Goodall');
// id = 3简·古德尔!她应该得到奖品。
declare @giveAPrizeTo int = (
select id
from custRef
where fname = 'Jane'
and lname = 'Goodall'
);我们很快就会送过去的。
但首先,另一项任务。无法联系到的客户并不是真正有用的。老板要求我们把桌子保持干净。
delete custRef where address is null;
alter table custRef alter column address nchar(80) not null;好吧,好吧,继续,加入下一个人。
insert custRef (fName, lName, address)
values ('Jeffrey', 'Dahmer', '1234 W Somewhere; Milwaukee, Wisconsin 12345');在这个假设的方言中,id的循环,Jeffrey现在有id= 3。
嗯,这很有趣。我应该小心最新的顾客。嗯,我分心了,我在做什么?哦,是的,那个奖品!我最好送过去。
declare @message nvarchar(max) = (
select 'Congratulations ' + fName + ' ' + lName ', ' +
'we support your good works. Have a prize!'
from custRef
where id = @giveAPrizeTo;
);
print (@message);祝贺杰弗里·达默,我们支持你的好作品。拿个奖!
糟了!
发布于 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,这样就可以编写
declare @id int = 0
SELECT @id = MAX(CustRef) FROM CustDetails
DBCC CHECKIDENT ('dbo.CustDetails', reseed, @id)这将告诉sql将值重置为最后一个最大值。这根本不是推荐的方法。这只是一个选项,但是是的,您可以在insert语句之前为get (CustRef)选择remove和写逻辑,然后增加它并插入到CustDetails表中。
https://stackoverflow.com/questions/67613999
复制相似问题