Сбросить столбец IDENTITY без удаления всех строк - PullRequest
0 голосов
/ 30 января 2019

У меня есть следующая таблица

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] NULL

Кроме того, у меня есть хранимая процедура (называется MySP ), которые выполняют следующие шаги:

  1. УДАЛИТЬ ИЗ [MyTable], ГДЕ [Постоянный] НЕДЕЙСТВИТЕЛЕН *
  2. (много вычислений)
  3. Вставить результаты пункта 2 в [MyTable]

MySP запускается каждый день, поэтому число [Idx] очень быстро увеличивается, так как каждый день 500.000 строк удаляются и вставляются.Моя цель во время выполнения SP - сбросить значение столбца [Idx], чтобы поддерживать максимально возможное число [Idx] ниже.

1-я попытка

Я пытался обновить следующий запрос в конце 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]

Вторая попытка После прочтения следующих двух вопросов/ answers

Я добавил следующее в конце MySP

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

, но также это не работает, поскольку в [MyTable], в отличие от ситуации обоих вопросов, остаются некоторые строкиТаким образом, существует конкретный риск того, что [Idx] не является уникальным, и это не хорошо, поскольку [Idx] является моим первичным ключом.

Как я могу сбросить значение столбца идентификаторов, а также строки, которые до сих поростается в [MyTable]?

1 Ответ

0 голосов
/ 30 января 2019

Используя @Killer Queen предложить, я решил использовать этот фрагмент кода, который находит MAX([Idx]) из MyTable после DELETE и повторно вводит идентификатор перед новым INSERT.

Это работает, потому что строки с [Permanent]=1 являются первыми строками, вставленными в таблицу, поэтому их значения [Idx] начинаются с 1 и очень малы.

DELETE 
FROM [MyTable]
WHERE [Permanent]!=1 OR [Permanent] IS NULL

DECLARE @MaxIdx As bigint
SET @MaxIdx = (SELECT ISNULL(MAX([Idx]),0) FROM [MyTable])

DBCC CHECKIDENT ('MyTable', RESEED, @MaxIdx); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...