我可以为MySQL中的每条记录获取一个唯一的TIMESTAMP

时间:2012-04-25 17:23:19

标签: mysql sql timestamp

是否有可能为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");

2 个答案:

答案 0 :(得分:6)

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

如果您需要暂时订购的唯一号码,则可以使用UUID

SELECT UUID()产生的结果如下:

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

过了一段时间后:

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

UUID的前三个部分由时间组成,但是,它们从最高精度到最低精度,因此您需要使用SUBSTR()和{{1}来反转前三个部分像这样:

CONCAT()

收率:

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

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

在数据库服务器上使用UUID()可能优先使用类似的功能,例如应用程序服务器上的PHP 11e1-8f00-45f9b8d6 函数,因为您的数据库服务器更集中。您可能有多个应用程序(Web)服务器,它可能会生成冲突值,而microtime()仍然不保证唯一值。

答案 1 :(得分:2)

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

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

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