[英]SQL Server updating a time stamp column
在我的数据库中,我有一个timestamp
列。 我需要更新表中的一行,并需要更新timestamp
列。 当我运行更新命令时,我得到:
Cannot update a timestamp column.
如何更新时间戳列?
您不更新timestamp列 - 只要更新行中的任何其他列,SQL Server就会自动更新时间戳(现在重命名的rowversion )列。
如果您已经知道这一点,但由于某种原因想要强制更新列,只需针对您想要影响的行执行更新。 即使它没有导致实际数据更改,时间戳列仍将更新:
create table #T1 (
ID int not null,
ts timestamp not null
)
insert into #T1 (ID)
select 1 union all
select 2
select * from #T1
update #T1 set ID = ID where ID=1
select * from #T1
ID ts
1 0x0000000000039AAF
2 0x0000000000039AB0
ID ts
1 0x0000000000039AB1
2 0x0000000000039AB0
虽然我的问题不是我的答案,但我想提一下TIMESTAMP
如何被误解。
您没有在问题中声明使用TIMESTAMP
列,但实际上您尝试更新它意味着(对我而言)您正在尝试记录数据何时发生更改。
当您真正想要使用DATETIME
记录更改时,请查看本文 (网上还有许多其他内容)关于使用TIMESTAMP
。
BOL说:
SQL Server时间戳数据类型与时间或日期无关。 SQL Server时间戳是二进制数,表示数据库中数据修改的相对顺序。 最初实现时间戳数据类型以支持SQL Server恢复算法。
正如Damien_The_Unbeliever所说,该类型已被重命名,描述如下:
rowversion数据类型只是一个递增的数字,不保留日期或时间。 要记录日期或时间,请使用datetime2数据类型。
当然,如果你以预期的方式使用数据类型忽略以上所有:)
我有同样的问题,我的解决方案:
UPDATE [table]
SET [ANY_COLUMN] = [ANY_COLUMN]
WHERE ID = [ID]
就像表值更改时重新计算时间戳一样,我将任何列更新为相同的值,因此更新时间戳
timestamp列无法更新,因为它是服务器生成的,并且被保证为整个数据库的唯一性 - 如果允许更新,则不是,那么该值不是唯一的。
我在尝试更新复制实例中的timestamp列时面临同样的问题,因为复制的实例没有与发布者相同的时间戳值 - 这在尝试获取每组记录的最后更新记录时会导致一些问题。 当然,通过复制,发布者只需一个简单的配置即可将相同的时间戳值复制到订阅者。
否则,没有其他方法可以更新时间戳值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.