我有一张看起来像这样的表:
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'条款。
答案 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_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
子句。条款的顺序无关紧要。如果两者都存在于列定义中,则可以先进行。 CURRENT_TIMESTAMP
的任何同义词与CURRENT_TIMESTAMP
具有相同的含义。这些是CURRENT_TIMESTAMP()
,NOW()
,LOCALTIME
,LOCALTIME()
,LOCALTIMESTAMP
和LOCALTIMESTAMP()
。
使用DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
特定于TIMESTAMP
。 DEFAULT
子句也可用于指定常量(非自动)默认值;例如,DEFAULT 0
或DEFAULT '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来管理) :
现在,包含时间戳的字段将始终在更新记录时更新为当前时间戳。