【问题标题】:SQL IDENTITIY Column not starting with 1SQL IDENTITY 列不以 1 开头
【发布时间】:2017-08-29 19:04:54
【问题描述】:

我在 SQL 2014 中有一个临时表。在这个表变量中我声明了一个标识列。

DECLARE  @TempTable TABLE
(
    ID int IDENTITY(1,1) PRIMARY KEY
    , IncidentResolvedOn date
    , IncidentCreatedOn date
    , IncidentClosedOn date
    , TaskAssigned date
    , TaskCompleted date
    , TaskID float
    , IncidentTeamID int
    , TotalDaysOutstanding int
    , TierInfo varchar(15)
    , Task_NoTask varchar(15)
    , Tier_2_Days_Outstanding int
    , Tier_1_Days_Outstanding int
    , DaysToResolve int
    , BadDays int
    , StartDate date
    , EndDate date
) 

当我运行查询的其余部分时,ID 列有时不是以 1 开头,而是以某个随机数开头。下面的代码是我用来插入此表变量的代码。

INSERT INTO @TempTable(IncidentResolvedOn, IncidentCreatedOn, IncidentClosedOn,TaskAssigned, TaskCompleted, TaskID, IncidentTeamID )
SELECT  [Incident Resolved On]
        , [Incident Created On]
        , [Incident Closed On]
        , [Task Assigned On]
        , [Task Completed On]
        , [Task ID]
        , IncidentTeamID

FROM HEATData

这发生在表变量和临时表中。我以前从未见过这种情况。通常,当我使用 IDENTITY(1,1) 短语时,无论我创建该表多少次,它总是以 1 开头。有什么建议吗?

【问题讨论】:

  • 如果您从临时表中选择,并按 ID 排序 - 第一个值会得到什么?
  • 有没有可能是在创建表之后,你在插入行,删除它们,然后再次插入,并期望第二次插入以 1 开头?
  • 有时,如果您运行失败的插入操作,序列会中断,就好像使用了失败的插入 id。
  • 我想知道,如果这是一个变量并且列是一个标识,为什么它是 1 还是其他什么都重要?
  • @Lamar 不是有时,而是每次。标识是尝试插入次数的运行计数。即使由于违反约束或其他原因导致插入失败,它也将始终在插入中递增。

标签: sql sql-server identity


【解决方案1】:

我想您的连接保持打开状态,因此您的身份不会为您的本地变量重置。这是一个例子。

DECLARE  @TempTable TABLE
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    ID2 int)
insert into @TempTable
values
(1),(2)

select * from @TempTable

delete from @TempTable

insert into @TempTable
values
(1),(2)

select * from @TempTable

现在,如果您使用GO 将其包装在自己的批次中,您会发现这不会发生。事实上,你必须重新声明你的表变量。

DECLARE  @TempTable TABLE
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    ID2 int)
insert into @TempTable
values
(1),(2)

select * from @TempTable

go


DECLARE  @TempTable TABLE
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    ID2 int)
insert into @TempTable
values
(1),(2)

select * from @TempTable

如果您没有明确删除#TempTable 或连接保持打开状态,#TempTable 也是如此。当然,对于实际表,增量将与第一个示例类似地继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多