cod*_*ero 30 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 ;
Run Code Online (Sandbox Code Playgroud)
在我看来,这意味着每当更新一行时,字段'Lastconnection'应该标有当前时间戳.但是,当我运行类似于:
update Hosts set Backupstatus = 'FAIL', Backupmsg = 'Connection timed out' where Tid = 'SITE001'
Run Code Online (Sandbox Code Playgroud)
Lastconnection保持'0000-00-00 00:00:00'.有一个我没有看到的数据库问题,或者我完全误解了'ON UPDATE CURRENT_TIMESTAMP'条款.
bar*_*ero 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(),
....
Run Code Online (Sandbox Code Playgroud)
我使用now(),因为CURRENT_TIMESTAMP它是别名,它更短.最后,表结构得到了CURRENT_TIMESTAMP,所以不用担心.
CREATED字段的技巧是记住在INSERT语句的两个字段上使用null ,对于UPDATE语句不需要:
INSERT INTO mytable (field1, field2, created, updated)
VALUES ('foo', 'bar', null, null);
Run Code Online (Sandbox Code Playgroud)
小智 15
可能是更新语句不会更改任何内容的情况.如果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'
您必须记住,如果在更新时没有更改任何值,则不会设置当前时间戳,
您必须在查询NOW()中设置值以设置当前时间戳!
update Hosts set Backupstatus = 'FAIL',Lastconnection = NOW() , Backupmsg = 'Connection timed out' where Tid = 'SITE001'
请记住,必须更改值才能更改当前时间戳.
| 归档时间: |
|
| 查看次数: |
73355 次 |
| 最近记录: |