时间戳列是唯一的吗?
Posted
技术标签:
【中文标题】时间戳列是唯一的吗?【英文标题】:Is TimeStamp column unique? 【发布时间】:2012-05-23 21:29:28 【问题描述】:TimeStamp
在所有行中都是唯一的吗?
上面有唯一索引吗?
【问题讨论】:
【参考方案1】:timestamp 是一种数据类型,它公开自动生成的二进制数,保证在数据库中是唯一的。时间戳通常用作对表行进行版本标记的机制。存储大小为 8 个字节。
欲了解更多信息,请查看THIS 文章。
【讨论】:
它的容量是多少?我们有可能在TimeStamp
列上有OverFlow
吗?
@Kerezo 容量至少为 2^63(如果不是 2^64)。你需要大约 9.22×10^18 的增量来溢出它。
@Kerezo 如今,这几乎是不可能的!如果您在 122 年内每秒插入 10000 个类似的东西,您将溢出时间戳:P
@aF 从我的工作来看,这 10000 每秒需要 5800 万年才能用完。 (我只检查过,因为你提到的速率会在大约 4 个月内溢出 facebook,而他们的 350 万行每秒更新一次——这正是他们在 2010 年使用的)
这在实践中是不正确的。请参阅我的答案以获得解释。 ***.com/a/49918160/1444548【参考方案2】:
来自MSDN article,强调我的:
Timestamp 是一种数据类型,它公开自动生成的、唯一的 数据库中的二进制数。时间戳通常用作 版本标记表行的机制。存储大小为 8 字节。 时间戳数据类型只是一个递增的数字,并且确实 不保留日期或时间。 要记录日期或时间,请使用 日期时间数据类型。
它还提供了这个有趣的注释:
可以使用 SELECT INTO 生成重复的时间戳值 SELECT 列表中包含时间戳列的语句。我们不 建议以这种方式使用时间戳。
在 SQL Server 2008 及更高版本中,timestamp
类型已重命名为 rowversion
,大概是为了更好地反映其用途和价值。
【讨论】:
【参考方案3】:文档说
数据库中的唯一二进制数
但在实践中,您可能会遇到这种说法不正确的情况。由于该值是从 database global counter
生成的,因此您在恢复数据库或在 tempdb
的表中使用 timestamp
时可能会遇到问题。
可以看到下一个值:
Select @@DBTS
在 SQL Server 2000 之前,有一个未记录的命令来更改值
DBCC CHECKDBTS (dbId, newTimestamp)
要更改 SQL Server 的非古代版本中的时间戳,请参阅此答案:
https://dba.stackexchange.com/a/11088/149485
【讨论】:
以上是关于时间戳列是唯一的吗?的主要内容,如果未能解决你的问题,请参考以下文章