【问题标题】:Using "rowversion" as primary key column使用“rowversion”作为主键列
【发布时间】:2013-10-28 09:49:16
【问题描述】:

我正在使用 SQL Server 2012,并且我想创建一个“更改”表 - 当第二个表列值发生更改时,它将使用来自其他表的数据填充。

我正在向“更改”表中添加“datatime2”和“rowversion”列,以便跟踪何时进行更改。

可以使用“rowversion”作为主键吗?

我已阅读here ,如果当前行已更新,它将被更改,这就是为什么它不是“主键”使外键无效的好候选者。

无论如何,如果它不会用作外键并且“更改”表的行将永远不会被更新(只会插入新行)是可以使用“rowversion”作为PK还是我应该使用附加列?

【问题讨论】:

  • 请您指定您使用的数据库。您能否还请解释一下您的上述逻辑的上下文......这个数据库是用来做什么的。即,如果这是用于数据仓库,那么这绝对是错误的处理方式。
  • 这个想法是,当表中的某些日期由于 DML 操作而发生更改时,旧数据将插入我的“更改”表中,因此如果我需要查看主要更改的方式或时间桌子已经做好了。
  • 您要么必须实现某种渐变维度,要么使用触发器。我更喜欢 SCD 的第一个选项,但这是一个复杂的实施过程。除此之外,为什么要使用行版本而不是物理主键?
  • 是的,我将使用触发器。系统中类似的表都是这样创建的,我正在关注它。无论如何,我已经读过这不是一个好主意,所以我决定检查它是否会出现这么大的问题。如果是,我将完成创建一个物理的。
  • @ElectricLlama 在“更改”表中,我将包含“主”表中的所有列+日期和行版本列。 “更改”表将使用“插入/删除/更新后”触发器了解“主”表中的记录如何随时间变化。

标签: tsql primary-key sql-server-2012 rowversion


【解决方案1】:

一些很好的信息here:

仔细阅读 MSDN 页面还表明,如果 SELECT INTO 语句使用不当,可能会出现重复的 rowversion 值。需要注意的地方。

我会坚持使用原始数据中的 Identity 字段,并将其转移到具有自己的 Identity 字段的更改跟踪表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2020-09-22
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多