我目前有一张桌子Messages
。 ID
列是主键,使用标识填充。
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无法理解的任何内容。
答案 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;