当前位置: 首页 > 面试题库 >

在不插入行的情况下获取下一个ID

鲜于光辉
2023-03-14
问题内容

在SQL(SQL Server)中,是否可以从表的标识列中检索下一个ID(整数),而实际上无需插入行?如果删除了最近的行,则不一定是最高ID加1。

我之所以这样问,是因为我们有时不得不用新行更新活动数据库。该行的ID在我们的代码中使用(例如,Switch(ID){Case
ID:},并且必须相同。如果我们的开发数据库和实时数据库不同步,最好预先预测一个行ID部署之前。

我当然可以 SET IDENTITY OFF SET INSERT_IDENTITY
ON或运行事务(这会回滚ID吗?)等,但我想知道是否有一个函数返回下一个ID(而不递增)。


问题答案:

编辑:

在花了几个小时比较整个页面转储之后,我意识到有一种更简单的方法,我应该留在DMV上。

该值在备份/还原后仍然有效,这清楚地表明了该值已存储-我转储了数据库中的所有页面,但是找不到添加记录时的位置/更改。比较20万行的页面转储并不是一件好事。

我使用了专用的管理控制台,对每个暴露的内部表都进行了转储,插入了一行,然后又对系统表进行了转储。这两个转储是相同的,这表明它可以生存,因此必须进行存储,即使在该级别也没有暴露。

因此,绕了一圈后,我意识到DMV确实有答案。

create table foo (MyID int identity not null, MyField char(10))
insert into foo values ('test')
go 10

-- Inserted 10 rows
select Convert(varchar(8),increment_value) as IncrementValue,
   Convert(varchar(8),last_value) as LastValue
from sys.identity_columns where name ='myid'


-- insert another row
insert into foo values ('test')

-- check the values again
select Convert(varchar(8),increment_value) as IncrementValue,
   Convert(varchar(8),last_value) as LastValue
from sys.identity_columns where name ='myid'

-- delete the rows
delete from foo


-- check the DMV again
select Convert(varchar(8),increment_value) as IncrementValue,
   Convert(varchar(8),last_value) as LastValue
from sys.identity_columns where name ='myid'

-- value is currently 11 and increment is 1, so the next insert gets 12
insert into foo values ('test')
select * from foo

Result:
MyID        MyField
----------- ----------
12          test

(1 row(s) affected)

仅仅因为行被删除,最后一个值没有被重置,所以最后一个值+增量应该是正确的答案。

也要在我的博客上写剧集。

哦,这是所有方法的捷径:

select ident_current('foo') + ident_incr('foo')

因此,事实证明这很容易-但这一切都假设在您找回ID时,没有其他人使用过您的ID。可以进行调查,但是我不想在代码中使用它。



 类似资料:
  • 我在我的应用程序中使用CloudKit作为远程保存数据的一种方式。我的一个记录具有保存图像的CKAsset属性。当我获取记录时,我意识到完成查询要花很多时间。经过多次测试,我得出结论,当您查询记录时,CloutKit会用record对象下载整个资产文件。因此,当您从record对象获取资产并请求它的fileURL时,它会给您一个本地文件路径URL,而不是HTTP类型的URL。这对我来说是一个问题,

  • 首先,如果这是一个很长的代码段,我很抱歉,但是,我想做一个模态窗口,它将你在我的用户表单中写的东西写下来,并要求你确认它。我目前正在学习Javascript,我不允许使用innerHTML,我必须动态地编写“名字”等(名字的文本),不允许只在弹出窗口内写它。我已经让大多数东西工作,但“名字”“名字”等显示为“未定义”,或者(正如你可以看到的,我在这种情况下只用名字尝试的事情)显示为“空”。 希望有

  • 尝试使用Request.GetParameter但结果检索到第一个值,即第一个索引: 将名称取为“MyArray[]”,并在下一页使用 访问该值` 现在我应该做什么,有没有替代方法或者要在这里做一些更改: 这是page One.jsp中的表单: 下面是代码片段: 注意:忽略计数器值,因为这里只是为了检查,代码运行正常,但它只使用Request.GetParameter检索第一个索引值。 请给我一些

  • 我用了这段代码并运行,但没有输出出来不知道为什么? 但如果正在使用s=“”;则也没有输出。 但是当我使用s=“”;那么输出就来了,为什么会这样呢?

  • 问题内容: 我试图将 1,500,000 条记录插入表中。在插入过程中遇到表锁定问题。所以我想出了下面的批处理插入。 我在表上有聚簇索引。部分只是为了限制插入的记录再次插入表中 我做对了,这样可以避免表锁定吗?还是有更好的方法。 注意: 批处理和不批处理插入所花费的时间或多或少相同 问题答案: 锁升级根本不可能与语句的一部分有关。 插入大量行是自然的结果 当使用ALTER TABLE SET LO

  • 问题内容: 我有一个包含800,000个没有主键的条目的表。我不允许添加主键,我无法按 TOP 1 .... ORDER BY DESC进行 排序, 因为完成此任务需要几个小时 。因此,我尝试了以下方法: 当然,这是行不通的。 无论如何要使用此代码或更好的代码来检索表中的最后一行? 问题答案: 我假设当您说“最后一行”时,您的意思是“最后创建的行”。 即使您具有主键,使用它来确定行的创建顺序仍然不