我的托管服务提供商昨天更新了我们的MySQL,现在我网站的重要部分无法正常运行。经过调查,我发现任何将时间戳记设置为默认值的UPDATE命令都无法更新时间戳记。这是一个已经运行了两年的网站。 MySQL的新版本是10.2.23-MariaDB-log-cll-lve。
例如,使用下表并向其中填充一些数据:
CREATE TABLE `NewTable` ( `NewTableKEY` INT NOT NULL AUTO_INCREMENT , `NewTableTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY (`NewTableKEY`));
INSERT INTO `NewTable` (`NewTableKEY`, `NewTableTime`) VALUES (NULL, DEFAULT);
我尝试使用DEFAULT更新时间戳:
UPDATE NewTable SET NewTableTime=DEFAULT;
在phpMyAdmin中,我得到的响应是:
0 rows affected. (Query took 0.0005 seconds.)
我也尝试使用NULL而不是默认值:
UPDATE NewTable SET NewTableTime=NULL;
以这种方式使用NULL确实会将Timestamp字段更新为当前时间。我发现在INSERT命令中使用DEFAULT可以正常工作。我还发现“更新时CURRENT_TIMESTAMP”功能可以按预期工作。
据我了解,在UPDATE命令中使用DEFAULT是正确的语法(并且已经使用了很多年)。我使用的语法错误吗?是否已弃用该语法?如果是这样,正确的语法是什么?
答案 0 :(得分:0)
将表定义更改为以下内容
{
"template" : "logstash-*",
"settings" : {
"index.refresh_interval" : "5s"
},
"mappings" : {
"_default_" : {
"_all" : {"enabled" : true, "omit_norms" : true},
"dynamic_templates" : [ {
"message_field" : {
"match" : "message",
"match_mapping_type" : "string",
"mapping" : {
"type" : "string", "index" : "analyzed", "omit_norms" : true
}
}
}, {
"string_fields" : {
"match" : "*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "string", "index" : "analyzed", "omit_norms" : true,
"fields" : {
"raw" : {"type": "string", "index" : "not_analyzed", "ignore_above" : 256}
}
}
}
} ],
"properties" : {
"@version": { "type": "string", "index": "not_analyzed" },
"geoip" : {
"type" : "object",
"dynamic": true,
"properties" : {
"location" : { "type" : "geo_point" }
}
}
}
}
}
}
这将在执行CREATE TABLE `NewTable` ( `NewTableKEY` INT NOT NULL AUTO_INCREMENT ,
`NewTableTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NewTableKEY`));
查询时自动更新时间戳。 DEFAULT仅适合于插入语句,但是,如果您指定UPDATE
,则MySQL将自动更新字段值(无需编写代码)
有关更多详细信息,请参见[https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html]。
希望这会有所帮助
如果要根据条件进行更新,请编写自己的代码或使用触发器,类似于以下内容,
ON UPDATE