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

Replace primary key Identity with sequence starting with next AUTO_INCREMENT value

我目前有一个 table、MessagesID 列是主键,使用标识填充。

x-----------------------------x
|    ID       |  Contents     | 
x-------------|---------------x
|    1        |  01234        |
|    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 的创建脚本上的构建操作必须设置为构建,这样解决方案就不会涉及 SSDT 不理解的任何内容。

您可以动态构建 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;