将主键标识替换为从下一个 AUTO_INCREMENT 值开始的序列
Replace primary key Identity with sequence starting with next AUTO_INCREMENT value
我目前有一个 table、Messages
。 ID
列是主键,使用标识填充。
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;
我目前有一个 table、Messages
。 ID
列是主键,使用标识填充。
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;