2012-04-25 31 views
5

每个记录的唯一时间戳有获得一个独特的时间戳值对于MySQL中的每个记录??的可能性..我能否获得在MySQL

我创建了一个示例表

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

并运行一些示例插入,似乎是时间戳值重复。

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

除非您阻止同时插入记录,否则可能存在重复的时间戳。 – 2012-04-25 17:26:40

+1

@MichaelMior我不能增加“TIMESTAMP敏感度”??使用毫秒等? Marcus只使用Select查询。通过肉眼我可以看到它。 – 2012-04-25 17:30:13

+0

MySQL不支持微秒(但5.6.4会),所以我建议去一个整数字段。 – Kostis 2012-04-25 17:30:16

回答

6

有一天很快(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()函数,因为数据库服务器更集中。您可能有多个应用程序(网络)服务器,可能会产生冲突的值,并且microtime()仍不能保证唯一值。

+0

+1很棒的信息。然而很少有问题出现。三个第一数字如何保证时间顺序?手册只是模糊地说:“前三个数字是从时间戳生成的。”应该总是使用完整的'UUID'(只是前三个数值反向排序)?在哪里可以找到关于此功能的更多信息。手册没有提到“最高精度到最小”的顺序? – 2012-04-25 21:01:26

+0

@ ZZ-bb,MySQL手册不包含详细信息,因为它们使用的UUID格式是[标准](http://pubs.opengroup.org/onlinepubs/9629399/toc.pdf)。无论何时设置时钟,UUID的第四部分都会更改。这是为了确保整个价值是独一无二的。只要你不惹你的时钟,前三部分都没问题。 – 2012-04-25 21:45:54

2

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

为什么timestamp是唯一的?如果你需要的唯一索引等

如果你需要比timestamp更精确的时间值使用auto increment或别的东西,请参阅:

+0

感谢您的描述性答案。自动增量不适用于我的问题。自更新查询执行。然后我无法检测到记录的顺序已经改变。这就是我试图使用TIMESTAMP的原因。 – 2012-04-25 17:43:28

+0

@Ashan插入记录时,'AI'会重新排列订单。但编辑是一个不同的故事。为何编辑订单很重要?我相信'timestamp'的主要功能是标记对行进行更改的时间,以便在插入后知道该行已更改或未更改。不要揭示变化的顺序。将'microtime'存储到某个列中可能是一个答案,但我不认为有任何保证,即使该值始终是唯一的。你可以插入'date'或'timestamp' +某种当前日期编辑的计数值。但是,再一次,如何跟踪编辑? – 2012-04-25 17:54:29