【问题标题】:Autoincrement version per Foreign Key SQL Server每个外键 SQL Server 的自动增量版本
【发布时间】:2018-09-18 08:54:28
【问题描述】:

我有一个名为Entity 的实体表,如下所示:

Entity
---------------------------
id (uniqueidentifier)
name (varchar(32))
description (varchar(max))

我想添加一个record booklog 表来存储实体的所有版本,命名为EntityLog

EntityLog
-------------------------
version ???
entityId (uniqueidentifier) fk Entity
name (varchar(32))
description (varchar(max))

EntityLog的版本栏只是一个草图,因为它还不存在所以可以操作。

如何根据外键 EntityId 自动分配版本,以便插入自动将版本从 1 更新到 2,依此类推,EntityId 没有每个表?

尽可能避免竞争条件,上下文包括多线程应用程序

编辑

尝试解决它:

  1. 读取最大版本select max(version) from entityLog where entityId = myId
  2. 插入 EntityLog 之前读取的数字 + 1,如果为 null,则只需 1

在 1 和 2 之间可能存在竞争条件,因此我希望委托给 SQL Server 一种像这样插入的线程安全方式

【问题讨论】:

  • 您如何确定版本号何时不同?在每次插入 EntityLog 时?
  • @AdinugrahaTawaqal 是的,第一个插入对应于第一个版本(编号 1)等等
  • 您可以在 EntityLog 上使用普通标识列,当您想按所述列显示版本号顺序并使用 ROWNUMBER() 函数作为版本时。 docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 如果您关心准确性 MAX(Col) + 1 不是一个好方法。也许您只需要一个日期时间列来记录添加 EntityLog 的时间。然后,您可以使用 ROW_NUMBER 创建一个计算列,并按 entityID 对其进行分区。
  • @AdinugrahaTawaqal 我最后添加了一个标识列和一个存储过程,其中 rownumber() 由 entityId 分区以实现版本控制。感谢您的提示,您可以发布作为答案,我很乐意接受它

标签: sql-server multithreading foreign-keys primary-key composite-primary-key


【解决方案1】:

您可以在 EntityLog 上使用普通标识列,当您想按该列显示版本号顺序并使用 ROWNUMBER() 函数作为版本时。

【讨论】:

    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2016-04-22
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多