gpt4 book ai didi

sql - 奇怪的 SQL Server 2012 IDENTITY 问题

转载 作者:行者123 更新时间:2023-12-04 12:48:30 26 4
gpt4 key购买 nike

我以前从未见过这种情况,非常奇怪。

我有一个正在开发的本地 SQL Server 2012 Express 数据库。使用 TestDrive 插件运行一套简单的测试并使用 EF v5 访问数据库。

我刚刚运行了一个测试,将一条记录插入到数据库中。表中有 9 行从 id 1-9 开始。下一个插入和 ID 正好跳了 10000 !!!!

Id 列:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10009

我知道失败的插入也会增加 ID,但我可以保证 10,000 在测试运行之间的 5 秒内没有插入失败......

表结构非常简单,一堆列和一个自动递增,类型为 bigint的标识列(长)、无 SP、触发器或任何其他程序化内容。
[Id] [bigint] IDENTITY(1,1) NOT NULL,

非常困惑,有没有其他人看到这种情况发生?

最佳答案

blog post有一些额外的细节。看起来像在 2012 年,identity是作为一个序列来实现的。默认情况下,一个序列有一个缓存。如果缓存丢失,您将丢失缓存中的序列值。

建议的解决方案是使用 no cache 创建一个序列:

CREATE SEQUENCE TEST_Sequence
AS INT
START WITH 1
INCREMENT BY 1
NO CACHE

据我所知,身份列后面的序列是不可见的。你不能改变它的属性来禁用缓存。

要将其与 Entity Framework 一起使用,您可以设置主键的 StoredGeneratedPattern Computed .然后您可以在 instead of insert 中生成身份服务器端扳机:
if exists (select * from sys.sequences where name = 'Sequence1')
drop sequence Sequence1
if exists (select * from sys.tables where name = 'Table1')
drop table Table1
if exists (select * from sys.triggers where name = 'Trigger1')
drop trigger Trigger1
go
create sequence Sequence1
as int
start with 1
increment by 1
no cache
go
create table Table1
(
id int primary key,
col1 varchar(50)
)
go
create trigger Trigger1
on Table1
instead of insert
as
insert Table1
(ID, col1)
select next value for Sequence1
, col1
from inserted
go
insert Table1 (col1) values ('row1');
insert Table1 (col1) values ('row2');
insert Table1 (col1) values ('row3');

select *
from Table1

如果您找到更好的解决方案,请告诉我:)

关于sql - 奇怪的 SQL Server 2012 IDENTITY 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13657461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com