【问题标题】:SQL Server error with Identity value when inserting row插入行时出现标识值的 SQL Server 错误
【发布时间】: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。
  • 如果密钥是静态的且众所周知的,请不要使用身份代理密钥。对值进行硬编码。您需要控制,以便数据库的所有实例中的值都相同。

标签: sql-server


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2020-11-16
    • 2021-08-03
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多