非标识列自动增量

时间:2016-07-21 22:10:45

标签: sql sql-server sql-server-2012

我正在开发一个项目来整合数据(来自2个不同的数据库)。我创建了一个包含几列的表:

  • MAPPING_ID int
  • ContentID int
  • ContentValue varchar(200)

例如,当我针对原始数据源执行第一组插入时,一切都很好。

Mapping_ID: 53
ContentID: 53
ContentValue: Original Data 1

Mapping_ID: 54
ContentID: 54
ContentValue: Original Data 2

但是,当我对另一个源(我尝试合并的数据)执行第二组插入时,我希望Mapping_ID列继续到下一个数字(即55,56,57 ... )

我查看了row_number功能,但从1开始。有没有办法在55开始?

我想我可以将Mapping_ID列设置为Identity字段,但在第一次插入时将其关闭,然后使用max值(54)将其播种,然后在第二次插入期间将其打开。

还有另一种方法可以实现这个目标吗?

3 个答案:

答案 0 :(得分:2)

在SQL Server 2012+中,您可以使用SEQUENCE个对象来填充具有自动增量值的非标识列。另外,您可以对不同的表使用相同的SEQUENCE来进行计算传递,并从SELECT和UPDATE查询中的序列中获取值。

首先,创建SEQUENCE:

CREATE SEQUENCE SchemaName.SequenceName
START WITH 1
INCREMENT BY 1 ;

然后,在所需列上使用values from sequence创建DEFAULT约束:

ALTER TABLE tableName ADD CONSTRAINT constraint_unique_name DEFAULT NEXT VALUE FOR SchemaName.SequenceName FOR Mapping_ID;

答案 1 :(得分:1)

要让row_number()从55开始,您只需在row_number()计算中添加54(或任何数字):

(row_number() over (partition by Y order by X)) + 54

答案 2 :(得分:1)

从SQL Server 2012开始,实际上有一种全新的方式来执行此类操作:序列对象。对不起,我不能为你编写程序,因为我目前在MySQL世界工作,但它实现起来非常容易。基本的想法是你要维护一个单独的数据库对象,它有自己的种子和增量,但是有一些注意事项要记住它们与传统身份值的区别(例如你可以覆盖它们),所以一定要做一些研究

以下是一些可以帮助您入门的文章。如果您遇到麻烦,请回复我,我会尝试与您一起完成代码。

https://msdn.microsoft.com/en-us/library/ff878091.aspx

https://msdn.microsoft.com/en-us/library/ff878370.aspx

祝你好运!