MySQL更新时当前\u时间戳未更新

MySQL更新时当前\u时间戳未更新,mysql,sql,timestamp,sql-update,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 '

我有一张像这样的桌子:

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'

最后一次连接保持“0000-00-00:00:00”。要么是我没有看到数据库问题,要么是我完全误解了“ON UPDATE CURRENT_TIMESTAMP”子句。

在更新时,您是否尝试对该字段使用null

您还可以尝试将默认值设置为
CURRENT\u 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()
,因为它是当前时间戳的别名,而且更短。最后,表结构会得到当前的时间戳,所以不用担心

创建
字段的诀窍是记住,对于
插入
语句,在两个字段上都使用null,对于
更新
语句,不需要:

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

要指定自动属性,请使用更新当前时间戳
子句上的
默认当前时间戳
。条款的顺序无关紧要。如果列定义中同时存在这两种情况,则可以先出现其中一种。
CURRENT\u TIMESTAMP
的任何同义词与
CURRENT\u TIMESTAMP
具有相同的含义。它们是
CURRENT\u TIMESTAMP()
NOW()
LOCALTIME
LOCALTIME()
LOCALTIMESTAMP
,以及
LOCALTIMESTAMP()

在更新当前时间戳时使用
默认当前时间戳
特定于
时间戳
DEFAULT
子句也可用于指定常量(非自动)默认值;例如,
default0
DEFAULT'2000-01-01 00:00:00'

DEFAULT 0
如果启用了
NO_ZERO_DATE
SQL模式,则该模式不起作用,因为该模式会导致拒绝“ZERO”日期值(例如,指定为0'0000-00-00 00:00:00))。请注意,
传统的
SQL模式包括
无零日期


此外,您可以通过为任何
TIMESTAMP
列指定
NULL
值,将其初始化或更新为当前日期和时间,除非已使用
NULL
属性对其进行了定义,以允许
NULL
值。

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

  • 创建字段来保存自动更新的时间戳(我通常称我的为“修改”)
  • 将字段类型指定为“时间戳”
  • 将字段默认值指定为“当前\u时间戳”
  • 将额外字段指定为“更新当前\u时间戳时”

  • 现在,每当记录更新时,包含时间戳的字段将始终更新为当前时间戳

    可能是update语句没有更改任何内容。如果具有
    Tid='SITE001'
    的行已经将
    Backupstatus
    设置为
    'FAIL'
    ,并且
    Backupmsg
    设置为
    'Connection timeout'
    (可能是由以前的备份尝试设置的),那么MySQL将跳过这一行,因此不会更改
    Lastconnection
    时间戳

    此外,我在UPDATE CURRENT_TIMESTAMP上看到的
    更像是一种跟踪数据更改的管理功能。作为程序员,我会明确添加时间戳更新:

    更新主机
    设置Backupstatus='FAIL',Backupmsg='Connection timed out',Lastconnection=NOW()
    其中,Tid='SITE001'

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

    您必须在query
    NOW()
    中设置当前时间戳的值

    updatehosts set Backupstatus='FAIL',Lastconnection=NOW(),Backupmsg='Connection timed out',其中Tid='SITE001'


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

    您的版本是什么?我之所以这样问是因为这个bug报告:您报告的ts列中填写了“0000-00-00:00:00”,这与我的猜测相矛盾,因为它可能有smth。和无零约会模式有关,但看看我认为可能就是这样。许多行被正确地标记,但有些行可能有重复的值。我将尝试升级。对查询中的datetime列使用null对我有效。根据当前时间戳,只有当行中的一个值发生更改时才会更新(即,如果所有值保持不变,
    lastconnection
    列也不会更新,即使您运行
    update
    query)有关此问题的更多说明。。。我必须在update语句中将timestamp字段设置为
    null
    。现在,每次更新字段时(即使数据没有真正更改)。是的,现在()还有其他同义词,如LOCALTIME、LOCALTIME()、LOCALTIMESTAMP、LOCALTIMESTAMP()、CURRENT_TIMESTAMP和CURRENT_TIMESTAMP()-使用
    UTC_TIMESTAMP()不是更好吗
    为了避免MySQL服务器时区与您的应用程序不同的问题?这只是重申了其他答案中已经提供的信息。简洁易读……这对我很有帮助!我只是在得到一个更新时,它被插入而不是更新。我错过了第4步。我是否错过了什么,或者这个答案是说要做OP已经在做的事情,但最终还是失败了?他说更新时带有
    的时间戳字段当前时间戳在更新时不会改变,不是吗?良好的时间戳一般信息;这个问题的答案很糟糕。这是一个常见的错误。没错,“on update”子句更具管理性