解释这个问题的最好方法是举个例子。
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
结果:
id | data | created | updated (NULL)| (NULL) | (NULL) | (NULL)
INSERT INTO example (
`data`
) VALUES (
'abc123'
)
结果:
id | data | created | updated 1 | abc123 | 2013-01-16 13:12:16 | (NULL)
UPDATE example SET
`data` = 'def456',
`updated` = NOW()
WHERE id = 1
结果:
id | data | created | updated 1 | def456 | 2013-01-16 13:16:24 | 2013-01-16 13:14:26
问题:请注意created
字段的更新方式以及正确保存更新字段的时间略有不同。我已经在同一个数据库中设置了这个示例表和其他类似的表,没有这个问题,所以我对此感到困惑。
答案 0 :(得分:11)
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会自动为您更新它:)
答案 1 :(得分: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;
也许有人使用第三方软件来创建它?
ON UPDATE CURRENT_TIMESTAMP
将破坏创建日期。所以解决问题像这样使用ALTER TABLE
:
ALTER TABLE example CHANGE created created TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
这将消除每次更新时created
字段的不必要的覆盖。