2016-11-25 53 views
0

我目前有一个表,MessagesID列是主键,并使用标识填充。将主键身份替换为从下一个AUTO_INCREMENT值开始的序列

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

我想删除的ID列的身份,并通过从序列,Messages_ID_Sequence填充的ID默认值替换它。

这很容易在SSDT中完成。然而,当我部署数据库项目,在Messages_ID_Sequence的第一个值是1。这是显而易见的,为什么当我在看的Messages_ID_Sequence生成的SQL:

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

当我尝试插入一个新的留言记录的问题发生。序列中的第一个值1填充新记录的ID列,并导致违反主键约束。

那么我怎样才能确保在创建Messages_ID_Sequence时,它会从身份提供的下一个ID开始? Messages_ID_Sequence的创建脚本的构建操作必须设置为Build,因此该解决方案不能涉及任何SSDT无法理解的内容。

回答

1

您可以构造din语句来创建序列,因此它始于您的最后一个身份。

/* 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

我已经更新了答案,现在它直接创建序列,因此您只需在更新数据库时调用它一次。 –

相关问题