在我的数据库中,我有一个timestamp
列。我需要更新表格中的一行,并需要更新timestamp
列。当我运行更新命令时,我得到:
Cannot update a timestamp column.
如何更新时间戳列?
答案 0 :(得分:31)
你没有
timestamp column is updated automatically。也许你的印象是时间戳包含与时间有关的值?它没有,但只是一个数字,只要该记录中的值是更新的数字。 将其视为行版本号。
来自MSDN:
时间戳数据类型只是一个 递增数字而不是 保留日期或时间。
答案 1 :(得分:3)
您不更新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
答案 2 :(得分:2)
虽然我不能回答你的问题但我想提及TIMESTAMP
如何被误解。
您没有在问题中声明使用TIMESTAMP
列,但事实上,您尝试更新它意味着(对我而言)您尝试记录数据何时更改。
当您真正想要使用TIMESTAMP
记录更改时,请查看this article(网上还有很多其他人)关于使用DATETIME
。
BOL说:
SQL Server时间戳数据类型 与时间或日期无关。 SQL Server时间戳是二进制的 表示相对的数字 数据修改的顺序 发生在一个数据库中。该 时间戳数据类型最初 实现支持SQL Server 恢复算法。
正如Damien_The_Unbeliever所说,该类型已重命名,描述如下:
rowversion数据类型只是一个 递增数字而不是 保留日期或时间。记录一个 日期或时间,使用datetime2数据 类型。
当然,如果您以预期的方式使用数据类型,请忽略以上所有内容:)
答案 3 :(得分:1)
timestamp列无法更新,因为它是服务器生成的,并且被保证为整个数据库的唯一性 - 如果允许更新,则不是,那么该值不是唯一的。
我在尝试更新复制实例中的timestamp列时遇到同样的问题,因为复制的实例没有与发布者相同的时间戳值 - 这在尝试获取每组记录的最后更新记录时导致了一些问题。当然,通过复制,发布者只需一个简单的配置即可将相同的时间戳值复制到订阅者。
否则,没有其他方法可以更新时间戳值。
答案 4 :(得分:1)
我有同样的问题,我的解决方案:
UPDATE [table]
SET [ANY_COLUMN] = [ANY_COLUMN]
WHERE ID = [ID]
就像表值更改时重新计算时间戳一样,我将任何列更新为相同的值,因此更新时间戳