【问题标题】:MS SQL Auto Increment non Identity ColumnMS SQL 自动增量非标识列
【发布时间】:2016-02-19 17:43:35
【问题描述】:

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

CREATE TABLE Table1(

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

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

[Version] [bigint] NOT NULL)

当我更新 [TextContent] 时,我希望 [Version] 加一。目的是为每一行创建一个版本,该版本在行更新时递增。

是否有合理的方法在单个表中执行此操作?可能与计算的列值和/或触发器有关?

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

感谢您提供任何信息!

【问题讨论】:

  • 触发器可以解决问题。还可以查看变更跟踪/CDC(变更数据捕获)。
  • 您是否需要仅在更新TextContent 列或更新任何列时更新Version 列?如果是后者,请查看特殊的 rowversion 列类型,它也可以转换为 bigint。

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


【解决方案1】:

方法一

尝试创建触发器

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

方法二

使用更新命令

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

UPDATE Tab
   SET Version= Version + 1
 WHERE id = 1

【讨论】:

  • @Simon Ordo 插入值后会将列值更新为 PrevValue +1 。让我知道是否有帮助
【解决方案2】:

这是在更新之后,如 cmets 中所述。它只是增加此行的版本

ALTER TRIGGER triggerIncrementUpdate
ON Table1
AFTER UPDATE

AS
BEGIN

UPDATE Table1 SET Version += 1 FROM Table1 INNER JOIN INSERTED As I ON Table1.ID = I.ID

END

【讨论】:

  • 我会说set version += 1
  • @IvanStarostin 你是对的,它应该是 MAX(Version) 而不是 MAX(ID)。
  • 不,不,不是 MAX!我相信他的观点是行版本号。每行都有自己的计数器。
  • 我的意思是version += 1。我想这就是这个专栏的目的。
  • 您在此版本的触发器中失去了与inserted 的连接
【解决方案3】:

使用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

【讨论】:

  • 不知何故此版本的触发器不引用INSERTED 表并且不支持多次插入/更新。
【解决方案4】:

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

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

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

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

但它非常有用,因为它仅在您更新一行时发生变化,并且始终使用更高的值进行更新,您可以将其强制转换为 bigint。

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

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 2011-03-07
    • 2015-09-16
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2012-06-06
    • 2022-12-10
    相关资源
    最近更新 更多