MS SQL自动递增非标识列

时间:2016-02-19 17:43:35

标签: sql-server entity-framework sql-server-2008 tsql entity-framework-core

我有一个表格,其中包含一个名为ID的自动递增标识/主键列。

CREATE TABLE Table1(

[ID] [bigint] IDENTITY(1,1) NOT NULL,

[TextContent] [nvarchar](450) NOT NULL,

[Version] [bigint] NOT NULL)

当我更新[TextContent]时,我希望[Version]增加1。目的是为每行添加一个版本,在行更新时随之增加。

在单个表格中有合理的方法吗?可能与计算列值和/或触发器有关吗?

我正在通过实体框架使用MSSQL 2008。

感谢您的任何信息!

4 个答案:

答案 0 :(得分:3)

方法1

尝试创建TRIGGER

> region1.parent_region = region2
> region2.child_regions
[region1]

> region1.save    
> Region.find(region1._id).parent_region
nil

方法2

使用更新命令

每次增加列值以及使用更新命令,如下所示

CREATE TRIGGER incrementValue
ON Table1
FOR Insert
AS 
   Update Table1 
   set columnvalue = columnvalue +1 
   where id in (select id from inserted)
GO

答案 1 :(得分:2)

这是在评论中讨论的更新之后。它只是递增此行的

v <- list(v1, v2, v3)
for (p in 1:length(pos)) {
    ind <- pos[1:p] == pos[p]
    i[p] <- v[[pos[p]]][cumsum(ind)[p]]
}
i
#> [1] "a" "b" "1" "x" "2" "3" "y" "4" "c" "z" "5" "d"

答案 2 :(得分:1)

使用trigger

Create trigger testtrigger
ON Table1
After insert
As
begin
declare @tempIDversion bigint
select @tempIDversion =ID from Table1
  insert into Table1(version) values (@tempIDversion)
END

答案 3 :(得分:0)

可能为时已晚,但SQL的 rowversion 数据类型会在每行插入或更新时自动更改。

作为Microsoft explains here的插入或更新,它是所有数据库的计数器:

  

每个数据库都有一个计数器,该计数器针对在数据库中包含rowversion列的表上执行的每个插入或更新操作递增。此计数器是数据库rowversion。这会跟踪数据库中的相对时间,而不是可以与时钟关联的实际时间。一个表只能有一个rowversion列。每次修改或插入具有rowversion列的行时,会在rowversion列中插入递增的数据库rowversion值。

这不会增加一个Vs.在您尝试实现的列的前一个值时,它只是设置了插入和更新的整个数据库计数器。

但它非常有用,因为它只会在您更新行时更改,并且始终使用更高的值进行更新,您可以将其强制转换为bigint。

你也可以为此目的忘记触发器。