MySQL ON UPDATE CURRENT_TIMESTAMP没有更新

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)

  • 我必须在update语句中将timestamp字段设置为`null`.现在每次更新字段(即使数据没有真正更改). (2认同)
  • 使用 `UTC_TIMESTAMP()` 来避免 MySQL 服务器时区与您的应用程序不同的问题不是更好吗? (2认同)

小智 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'
.

  • 这是一个常见的错误,"on update"子句更具管理性,不应该像这样使用.如果数据没有真正的变化,它将无法工作. (3认同)

Pin*_*yni 7

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

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

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

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