将主键标识替换为从下一个AUTO_INCREMENT值开始的序列

时间:2016-11-25 15:08:34

标签: sql-server sql-server-2012 sql-server-data-tools

我目前有一张桌子MessagesID列是主键,使用标识填充。

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

我想删除ID列上的标识,并通过从序列ID填充默认值Messages_ID_Sequence来替换它。

这很容易在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

当我尝试插入新的Message记录时,会出现问题。序列中的第一个值1填充新记录的ID列,并导致违反主键约束。

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

1 个答案:

答案 0 :(得分: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;