2016-11-25 4 views
0

В настоящее время у меня есть таблица, Messages. Столбец ID является первичным ключом и заполняется с использованием Identity.Заменить первичный ключ Идентификация с последовательностью, начинающейся со следующего значения AUTO_INCREMENT

x-----------------------------x 
| ID  | Contents  | 
x-------------|---------------x 
| 1  || 
| 2  | 56789  | 
x-----------------------------x 

Я хочу, чтобы удалить идентичность на ID колонки и заменить его заселение значения по умолчанию ID из последовательности, Messages_ID_Sequence.

Этого достаточно легко сделать в SSDT. Тем не менее, когда я развернуть проект базы данных, первое значение в Messages_ID_Sequence равно 1. Это понятно, почему, когда я смотрю на SQL, сгенерированный для Messages_ID_Sequence:

CREATE SEQUENCE [dbo].[CommandMsgs_MSGID_Sequence] 
    AS BIGINT 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO CYCLE 
    CACHE 10 

Проблема происходит, когда я пытаюсь вставить новую запись сообщений. Первое значение из последовательности, 1, заполняет столбец идентификатора новой записи и вызывает нарушение ограничения первичного ключа.

Итак, как я могу гарантировать, что при создании Messages_ID_Sequence он начнется со следующего ID, который предоставил бы идентификатор? Для сценария создания на сценарии создания Messages_ID_Sequence должно быть установлено значение Build, чтобы решение не могло включать ничего, что SSDT не понимает.

ответ

1

Вы можете построить динамическое предложение SQL для создания вашей последовательности, чтобы оно начиналось с вашего последнего идентификатора.

/* Read the last identity value */ 
DECLARE @value bigint; 
select @value = max(id_field) from my_table; 

/* Create the sequence starting at that value */ 
DECLARE @sql nvarchar(max); 
SET @sql = N'CREATE SEQUENCE [dbo].[CommandMsgs_MSGID_Sequence] AS BIGINT START WITH ' + cast(@value as nvarchar(20)) + ' INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 10;'; 
EXEC SP_EXECUTESQL @sql; 

Или обновите в любой момент свою последовательность, чтобы она начиналась с нужного значения.

/* Read the last identity value */ 
DECLARE @value bigint; 
select @value = max(id_field) from my_table; 

/* Create the sequence starting at that value */ 
DECLARE @sql nvarchar(max); 
SET @sql = N'ALTER SEQUENCE StreamEntrySequence RESTART WITH ' + cast(@value as nvarchar(20)) + ';'; 
EXEC SP_EXECUTESQL @sql; 
+0

Когда я это выполнил? Как сценарий после развертывания? Если он добавлен в мои сценарии после развертывания, он будет выполняться каждый раз при публикации базы данных. Это не похоже, что это обязательно будет вредно, но это расточительно, учитывая, что это нужно делать только один раз для среды. –

+0

Вы можете выполнить его на своем сценарии развертывания сразу после создания последовательности. –

+0

Я обновил ответ, поэтому теперь он непосредственно создает последовательность, поэтому вам нужно только позвонить его один раз при обновлении базы данных. –