更新选项:行版本与日期时间
Upsert options: rowversion vs datetime
很多时候我需要将大型 table(我们称之为源)的数据移动到它的克隆(我们称之为目标)。由于尺寸较大,而不是 deleting/inserting all,我更喜欢 upsert.
为简单起见,我们假设一个名为 "id" 的 int PK col。
到目前为止,为了做到这一点,我使用了日期时间字段 dbupddate,它存在于两个 table 上,它保存该行的最近时间 inserted/updated。这是通过使用触发器完成的,对于任何 insert/updates,将 dbupddate 设置为 getdate()。
因此,到目前为止,我的 运行-of-the-mill upsert 代码看起来像这样:
update t set (col1=s.col1,col2=s.col2 etc)
from source s
inner join target t on s.id=t.id and s.dbupddate>t.dbupddate
insert target
select * from source s
where not exists (select 1 from target t where t.id=s.id)
最近我偶然发现了 rowversion
。我已经阅读并在一定程度上理解了它的功能,但我想知道 benefits/drawbacks 实际上有什么,以防我将 dbupddate 更改为 rowversion 而不是 datetime。
虽然 datetime 包含在某些情况下可能有用的信息,但 rowversion 更可靠,因为系统 datetime 总是有被更改和失去准确性的风险。
对于您的情况,我个人更喜欢 rowversion,因为它的可靠性。
很多时候我需要将大型 table(我们称之为源)的数据移动到它的克隆(我们称之为目标)。由于尺寸较大,而不是 deleting/inserting all,我更喜欢 upsert.
为简单起见,我们假设一个名为 "id" 的 int PK col。
到目前为止,为了做到这一点,我使用了日期时间字段 dbupddate,它存在于两个 table 上,它保存该行的最近时间 inserted/updated。这是通过使用触发器完成的,对于任何 insert/updates,将 dbupddate 设置为 getdate()。
因此,到目前为止,我的 运行-of-the-mill upsert 代码看起来像这样:
update t set (col1=s.col1,col2=s.col2 etc)
from source s
inner join target t on s.id=t.id and s.dbupddate>t.dbupddate
insert target
select * from source s
where not exists (select 1 from target t where t.id=s.id)
最近我偶然发现了 rowversion
。我已经阅读并在一定程度上理解了它的功能,但我想知道 benefits/drawbacks 实际上有什么,以防我将 dbupddate 更改为 rowversion 而不是 datetime。
虽然 datetime 包含在某些情况下可能有用的信息,但 rowversion 更可靠,因为系统 datetime 总是有被更改和失去准确性的风险。 对于您的情况,我个人更喜欢 rowversion,因为它的可靠性。