【问题标题】:Is TimeStamp column unique?时间戳列是唯一的吗?
【发布时间】:2012-05-23 21:29:28
【问题描述】:

TimeStamp 在所有行中都是唯一的吗?

上面有唯一索引吗?

【问题讨论】:

    标签: sql sql-server sql-server-2008 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 年使用的)
    • 这在实践中是不正确的。请参阅我的答案以获得解释。 stackoverflow.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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 2011-08-02
        相关资源
        最近更新 更多