插入行时出现标识值的 SQL Server 错误

Posted

技术标签:

【中文标题】插入行时出现标识值的 SQL Server 错误【英文标题】:SQL Server error with Identity value when inserting row 【发布时间】:2020-06-15 18:42:36 【问题描述】:

这里的情况很奇怪。我正在使用 IDENTITY (1,1) 的主键在表中插入一行,但它使用的值是错误的。这是表格:

CREATE TABLE [dbo].[adm_tm_modulo](
    [id_modulo] [int] IDENTITY(1,1) NOT NULL,
    [codigo] [varchar](255) NULL,
    [descripcion] [varchar](255) NULL,
    [estado] [int] NOT NULL,
    [fecha_actualizacion] [datetime2](7) NULL,
    [fecha_creacion] [datetime2](7) NULL,
    [id_usuario_actualizacion] [int] NOT NULL,
    [id_usuario_creacion] [int] NOT NULL,
    [nombre] [varchar](255) NULL,
    [ruta] [varchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
    [id_modulo] 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

现在,如您所见,它有 4 行:

但是每当我插入一个新行时,主键就好像 IDENTITY 值从 1000 开始一样。这是我执行 INSERT 后发生的情况:

我确信我以前从未插入过这么多行,也没有任何其他人插入过,因为这是我自己 PC 中的私有数据库。此外,添加所有表的所有行,它们大约是 400(甚至接近 1000)。我尝试在其他表中插入,但发生了同样的事情,只是在某些表中它插入了一个从 3001 或 4001 等开始的值。它总是从一千之后的第一个数字开始。

任何关于为什么会发生这种情况的帮助将不胜感激。

【问题讨论】:

IDENTITY 的值可能会由于缓存而出现这样的间隙,这是正常的预期行为。 @DanGuzman 我可以更改缓存设置吗?我实际上需要它们是连续的 “需要”连续的 ID 值通常表示数据模型不好。为什么它们需要连续? @EricBrandt 这个特定的表将是静态的,并且在数据库的初始脚本中。其他静态表将取决于此 ID。 如果密钥是静态的且众所周知的,请不要使用身份代理密钥。对值进行硬编码。您需要控制,以便数据库的所有实例中的值都相同。 【参考方案1】:

您可能想要使用 SEQUENCE 对象,它可以让您更好地控制值生成的行为。 https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15

另一个选项(我更喜欢更好)是创建一个 INSERT TRIGGER 并在其中定义您想要的逻辑

【讨论】:

以上是关于插入行时出现标识值的 SQL Server 错误的主要内容,如果未能解决你的问题,请参考以下文章

重新插入以前删除的行时 SQL SERVER 2017 主键冲突

系统学习SQL1:误入SQL Server

八SQL Server(T-SQL)数据语言操作

八SQL Server(T-SQL)数据语言操作

八SQL Server(T-SQL)数据语言操作

八SQL Server(T-SQL)数据语言操作