2

解释这个问题的最好方法是举个例子。

我有一张桌子:

CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` varchar(255) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

结果:

   编号 | 数据 | 创建 | 更新
 (空)| (NULL) | (NULL) | (空值)

然后我插入一些数据:

INSERT INTO example (
  `data`
) VALUES (
  'abc123'
)

结果:

  编号 | 数据 | 创建 | 更新
   1 | abc123 | 2013-01-16 13:12:16 | (空值)

然后我更新

UPDATE example SET 
  `data` = 'def456',
  `updated` = NOW()
WHERE id = 1

结果:

  编号 | 数据 | 创建 | 更新
   1 | def456 | 2013-01-16 13:16:24 | 2013-01-16 13:14:26

问题:注意created字段如何更新,并且正确保存更新字段的时间略有不同。我已经在同一个数据库上设置了这个示例表和其他类似的表,没有这个问题,所以我完全被它弄糊涂了。

4

2 回答 2

12

updated需要是:TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

所以你CREATE TABLE会是:

CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` varchar(255) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

这意味着当您UPDATE将来执行时,您不需要传入更新变量,因为 MySQL 会自动为您更新它:)

于 2013-01-16T11:31:43.590 回答
2

这可能是意外创建问题表的方式:

CREATE TABLE `example` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `data` VARCHAR(255) DEFAULT NULL,
  `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `updated` DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

也许有人使用 3rd 方软件来创建它?

AnON UPDATE CURRENT_TIMESTAMP将破坏创建日期。所以要解决这个问题,像这样使用ALTER TABLE

ALTER TABLE example CHANGE created created TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

这将消除created每次更新时不需要的字段覆盖。

于 2013-02-03T09:36:04.290 回答