【问题标题】:Can I get a unique TIMESTAMP for every record in MySQL我可以为 MySQL 中的每条记录获取唯一的 TIMESTAMP
【发布时间】:2012-05-06 10:23:30
【问题描述】:

是否有可能为 MySQL 中的每条记录获取唯一的时间戳值??..

我创建了一个示例表

CREATE TABLE t1 (id int primary key, name varchar(50), 
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );

并运行了一些示例 INSERTIONS,似乎时间戳值重复。

e.g  insert into t1(id,name) values(1,"test");

【问题讨论】:

  • 除非您阻止同时插入记录,否则可能会有重复的时间戳。
  • @MichaelMior 我不能增加“TIMESTAMP 灵敏度”吗??.. 使用毫秒等? Marcus 仅使用 Select 查询。通过肉眼我可以看到它。
  • MySQL 不支持微秒(但 5.6.4 支持)所以我建议使用整数字段。
  • @Kostis 你的意思是只使用一个整数字段并不断增加?.. 我该如何应对更新??.. 找到最大的整数值并加一个?
  • @Ashan 你的用例没有通过自动递增的主键解决吗?

标签: mysql sql timestamp


【解决方案1】:

是的,如果您在一秒钟内没有进行两次或多次插入或编辑。唯一的问题是可以在一秒钟内完成很多事情,即使用where 子句进行多次插入或自动更新。这排除了强制唯一时间戳的简单解决方案:将unique 约束添加到timestamp 列中。

为什么timestamp 应该是唯一的?如果您需要唯一索引等,请使用 auto increment 或其他内容。

如果您需要比timestamp 更精确的时间值,请参阅:

【讨论】:

  • 感谢您的描述性回答。自动增量对我的问题不起作用。由于执行了更新查询。然后我无法检测到记录的顺序发生了变化。这就是我尝试使用 TIMESTAMP 的原因。
  • @Ashan 插入记录时AI 重新排序。但编辑是另一回事。为什么编辑订单很重要?我相信timestamp 的主要功能是标记对一行进行更改的时间,以便您知道插入后该行是否发生了更改。不透露变化的顺序。将microtime 存储到某个列中可能是一个答案,但我认为不能保证即使该值始终是唯一的。您可以插入 datetimestamp + 当前日期编辑的某种计数值。但话又说回来,如何跟踪编辑?
【解决方案2】:

很快的某一天(5.6.4),MySQL 将在 TIMESTAMP 列中提供fractional seconds,但是,即使小数秒也不能保证是唯一的,尽管理论上它们通常是唯一的,特别是如果您限制MySQL 到单线程。

如果您需要临时排序的唯一编号,您可以使用UUID

SELECT UUID() 产生类似:

45f9b8d6-8f00-11e1-8920-842b2b55ce56

一段时间后:

004b721a-8f01-11e1-8920-842b2b55ce56

UUID 的前三个部分由时间组成,但是,它们的顺序是从最高精度到最低精度,因此您需要使用 SUBSTR()CONCAT() 来反转前三个部分,如下所示:

SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4),
  '-', SUBSTR(UUID(), 1, 8))

产量:

11e1-8f00-45f9b8d6

你显然不能使用这样的函数作为默认值,所以你必须在代码中设置它,但它是一个保证唯一的时间排序值。 UUID() 在比秒(时钟周期)低得多的水平上工作,因此每次调用都保证它是唯一的,并且开销低(没有像 auto_increment 这样的锁定)。

在数据库服务器上使用 UUID() 可能优于在应用程序服务器上使用类似函数,例如 PHP 的 microtime() 函数,因为您的数据库服务器更加集中。您可能有多个应用程序(Web)服务器,这可能会产生冲突值,并且 microtime() 仍然不能保证唯一值。

【讨论】:

  • +1 很棒的信息。然而,很少有问题出现。前三个数字如何保证时间顺序?手册含糊地说:“前三个数字是从时间戳生成的。”是否应该始终使用完整的UUID(只是前三个值颠倒排序)?在哪里可以找到有关此功能的更多信息。手册没有提到“从最高到最低”的顺序?
  • @ZZ-bb,MySQL 手册不包含详细信息,因为他们使用的 UUID 格式是 standard。每当您将时钟调回时,UUID 的第四部分都会发生变化。这是为了确保值作为一个整体是唯一的。只要你不弄乱你的时钟,前三个部分就可以了。
  • 更正:UUID 的 第三部分 在最高有效位中还包含一个 4 位“版本”,然后是时间的高 12 位(参见@ 987654324@)。因此,在您的示例中,您错误地选择了时间戳的 最高位:您需要选择 12 位而不是 16 位(即选择不是 4,而是选择 3 个十六进制数字)。 最高时间戳部分(来自UUID的第三块)的正确选择是SUBSTRING(UUID(), 16, 3),然后结果将是1e1-8f00-45f9b8d6
  • 正确示例以及关于如何从 UUID 中提取时间戳的详尽解释可以在以下文章中找到:Extracting timestamp and MAC address from UUIDs
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多