重置IDENTITY列,删除所有行

时间:2019-01-30 11:15:42

标签: sql-server sql-server-2005 primary-key sql-server-identity

我有下表

CREATE TABLE [dbo].[MyTable](
    [Name] NVARCHAR(200) NOT NULL,
    [Surname] NVARCHAR(200) NOT NULL,
    [Permanent] [bit] NULL,
    [Idx] [bigint] IDENTITY(1,1) NOT NULL
 CONSTRAINT [MyTable] PRIMARY KEY CLUSTERED 
(
    [Idx] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

包含1000行,其中[Permanent] = 1和500.000行,其中[Permanent]为空

此外,我有一个存储过程(称为 MySP ),该过程执行以下步骤:

  1. 从[MyTable]删除[永久]为空
  2. (大量计算)
  3. 将第2点的结果插入[MyTable]

MySP每天运行,因此随着每天删除和插入500.000行,[Idx]的数量会迅速增加。 我的目标是在执行SP的过程中,重置[Idx]列的值,以使[Idx]的最大数量可能更低。

第一次尝试

我已尝试在MySP的末尾使用以下查询进行更新,但系统给我一个(正确的)错误。

UPDATE A
SET A.[Idx]=B.[Idx_new]
FROM [dbo].[MyTable] A
INNER JOIN (
    SELECT [Idx],ROW_NUMBER() OVER (ORDER BY [Idx]) AS [Idx_new]
    FROM [dbo].[MyTable]
) B
ON A.[Idx]=B.[Idx]

第二次尝试 阅读以下两个问题/答案

我在MySP的末尾添加了以下内容

DBCC CHECKIDENT ('MyTable', RESEED, 1); 

但这也不能像[MyTable]中那样工作,与两个问题的情况不同,它们保留了一些行,因此[Idx]不是唯一的且不如[Idx]的情况是一个具体的风险是我的主键。

如何重置标识列值以及仍然保留在[MyTable]中的行?

1 个答案:

答案 0 :(得分:0)

使用datevariablename.ToString("yyyyMMdd") 的建议,我使用此代码段解决了该问题,该代码段在@Killer Queen之后找到MAX([Idx])的{​​{1}},并在新{ {1}}。

之所以起作用,是因为带有MyTable的行是表中插入的第一行,因此它们的DELETE的值从1开始且非常低。

INSERT