我可以在MySQL的UPDATE命令中使用DEFAULT设置时间戳吗?

时间:2019-06-05 13:15:50

标签: mysql mariadb

我的托管服务提供商昨天更新了我们的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是正确的语法(并且已经使用了很多年)。我使用的语法错误吗?是否已弃用该语法?如果是这样,正确的语法是什么?

1 个答案:

答案 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