MySQL ON UPDATE CURRENT_TIMESTAMP没有更新

时间:2011-04-06 18:36:52

标签: mysql sql timestamp sql-update

我有一张看起来像这样的表:

CREATE TABLE IF NOT EXISTS `Hosts` (
`id` int(128) NOT NULL AUTO_INCREMENT,
`IP` varchar(15) NOT NULL DEFAULT '',
`Port` varchar(5) NOT NULL DEFAULT '',
`Password` varchar(32) NOT NULL DEFAULT '',
`Username` varchar(32) NOT NULL DEFAULT '',
`Tid` varchar(32) NOT NULL DEFAULT '',
`EquipType` varchar(64) NOT NULL DEFAULT '',
`Version` varchar(128) DEFAULT NULL,
`Status` varchar(10) NOT NULL DEFAULT '',
`Location` varchar(128) NOT NULL DEFAULT '',
`Lastconnection` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`Lastbackup` date NOT NULL DEFAULT '0000-00-00',
`Backupstatus` varchar(64) NOT NULL DEFAULT '',
`Backupmsg` text,
`Backupfile` varchar(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `IP` (`IP`),
KEY `Tid` (`Tid`),
KEY `EquipType` (`EquipType`),
KEY `Status` (`Status`),
KEY `Lastbackup` (`Lastbackup`),
KEY `Backupstatus` (`Backupstatus`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=716 ;

在我看来,这意味着每当更新一行时,字段'Lastconnection'应标记当前时间戳。但是,当我运行类似的东西时:

update Hosts set Backupstatus = 'FAIL',  Backupmsg = 'Connection timed out' where Tid = 'SITE001'

Lastconnection保持'0000-00-00 00:00:00'。有一个我没有看到的数据库问题,或者我完全误解了'ON UPDATE CURRENT_TIMESTAMP'条款。

5 个答案:

答案 0 :(得分:33)

您是否尝试在更新时为该字段使用null?

您也可以尝试将默认值设置为CURRENT_TIMESTAMP,而不是0000-00-00 00:00:00

然而,每当我想要创建和更新时间时,我总是使用以下内容:

...
CREATED timestamp NOT NULL default '0000-00-00 00:00:00',
UPDATED timestamp NOT NULL default now() on update now(),
....

我使用now(),因为它是CURRENT_TIMESTAMP的别名,而且更短。最后,表格结构得到CURRENT_TIMESTAMP,所以不用担心。

CREATED字段的技巧是记住在INSERT语句的两个字段上使用null,对于UPDATE语句不需要:

INSERT INTO mytable (field1, field2, created, updated)
VALUES ('foo', 'bar', null, null);

答案 1 :(得分:14)

可能是更新语句不会更改任何内容的情况。如果包含Tid = 'SITE001'的行已将Backupstatus设置为'FAIL'Backupmsg设置为'Connection timed out'(可能由以前的某些备份尝试设置),则MySQL将跳过此行,因此不会更改Lastconnection时间戳。

此外,我认为ON UPDATE CURRENT_TIMESTAMP更像是一个管理功能,可以跟踪数据更改。作为程序员,我会明确地添加时间戳更新:

update Hosts
set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out', Lastconnection = NOW() where Tid = 'SITE001'

答案 2 :(得分:7)

您必须记住,如果更新时没有更改的值,则不会设置当前时间戳,

您必须在查询NOW()中设置值以设置当前时间戳!!!

update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'

请记住,必须更改值才能更改当前时间戳。

答案 3 :(得分:1)

要指定自动属性,请使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP子句。条款的顺序无关紧要。如果两者都存在于列定义中,则可以先进行。 CURRENT_TIMESTAMP的任何同义词与CURRENT_TIMESTAMP具有相同的含义。这些是CURRENT_TIMESTAMP()NOW()LOCALTIMELOCALTIME()LOCALTIMESTAMPLOCALTIMESTAMP()

使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP特定于TIMESTAMPDEFAULT子句也可用于指定常量(非自动)默认值;例如,DEFAULT 0DEFAULT '2000-01-01 00:00:00'

如果DEFAULT 0 SQL模式已启用,则

NO_ZERO_DATE不起作用,因为该模式会导致“零”日期值(例如,指定为0'0090 00:00:00 ')被拒绝。请注意,TRADITIONAL SQL模式包括NO_ZERO_DATE

此外,您可以为任何TIMESTAMP列初始化或更新为当前日期和时间,方法是为其指定NULL值,除非已使用NULL属性定义了该值NULL值。

答案 4 :(得分:-1)

如果您希望记录在更改记录时自动更新时间戳,请执行以下四个简单步骤(可以一步完成,具体取决于您是使用命令行还是GUI来管理) :

  1. 创建字段以保存自动更新的时间戳(我通常将其称为“已修改”)。
  2. 将字段类型指定为“TIMESTAMP”
  3. 指定字段默认为“CURRENT_TIMESTAMP”
  4. 将字段Extra指定为'ON UPDATE CURRENT_TIMESTAMP'
  5. 现在,包含时间戳的字段将始终在更新记录时更新为当前时间戳。