5

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

2 回答 2

5

很快的某一天(5.6.4),MySQL 将在 TIMESTAMP 列中提供小数秒,但是,即使小数秒也不能保证是唯一的,尽管理论上,它们通常是唯一的,特别是如果您将 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() 仍然不能保证唯一值。

于 2012-04-25T18:16:08.297 回答
2

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

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

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

于 2012-04-25T17:35:54.760 回答