是否有可能为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");
答案 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
更精确的时间值,请参阅:
double(13,3)
可以将微缩胶片添加到数据库中。)int
乘以100或1000也可以。此处decimal
优先于double
。)