MySQL 5.5.21 ON UPDATE CURRENT_TIMESTAMP 不正确

mba*_*ger 6 mysql timestamp row-modification-time

正如标题所说,我在“ON UPDATE CURRENT_TIMESTAMP”方面遇到了一些问题。这是表的 SQL 定义:

CREATE TABLE `judgements` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) NOT NULL DEFAULT '0',
  `entry_id` bigint(20) NOT NULL,
  `group_id` bigint(20) NOT NULL,
  `comments` longtext,
  `rating` int(11) DEFAULT '0',
  `status` int(11) NOT NULL DEFAULT '1',
  `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`,`entry_id`,`group_id`),
  KEY `group_id` (`group_id`),
  KEY `entry_id` (`entry_id`),
  KEY `status_id` (`status`),
  CONSTRAINT `entry_id` FOREIGN KEY (`entry_id`) REFERENCES `entries` (`id`),
  CONSTRAINT `group_id` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`),
  CONSTRAINT `status_id` FOREIGN KEY (`status`) REFERENCES `status` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9082 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

使用 Wordpress 数据库类 ( $wpdb->insert ) 插入记录。除了id和之外的所有字段modified都以关联数组的形式传递给函数。这按预期工作,插入记录并应用时间戳。问题是这个时间戳并不总是正确的。
在看似随机的情况下(大约 15% 的插入),时间戳将在未来最多 30 分钟的任何地方......我找不到这种行为的任何模式,这使得问题难以追踪。
如果相关,该表每天几个小时都会经历相当多的插入量。
在搜索谷歌和这个网站后,我离追查问题不远了。我确实设法找到了几年前的一个论坛帖子,其中有人遇到了类似的问题,但唯一的答复是提交了错误报告。有没有其他人经历过这种情况或有关于为什么会发生这种情况的理论?

谢谢。

Rol*_*DBA 3

我认为你不应该使用DEFAULT (constant)with ON UPDATE

根据MySQL 文档

使用ON UPDATE CURRENT_TIMESTAMP子句和常量 DEFAULT 子句,该列将自动更新为当前时间戳并具有给定的常量默认值。

CREATE TABLE t1
(
    ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

这可能只是践踏了当前的日期时间。

同一页上,写着

使用ON UPDATE CURRENT_TIMESTAMP子句但不DEFAULT使用子句时,该列会自动更新为当前时间戳。除非使用 NULL 属性定义列,否则默认值为 0,在这种情况下,默认值为 NULL。

CREATE TABLE t1
 (
     ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP      -- default 0
 );
 CREATE TABLE t2
 (
     ts TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
 );
Run Code Online (Sandbox Code Playgroud)

我建议只删除DEFAULT '0000-00-00 00:00:00'

试一试 !!!