我有下表
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 ),该过程执行以下步骤:
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]中的行?
答案 0 :(得分:0)
使用datevariablename.ToString("yyyyMMdd")
的建议,我使用此代码段解决了该问题,该代码段在@Killer Queen
之后找到MAX([Idx])
的{{1}},并在新{ {1}}。
之所以起作用,是因为带有MyTable
的行是表中插入的第一行,因此它们的DELETE
的值从1开始且非常低。
INSERT