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

最佳答案

将表定义更改为以下内容

CREATE TABLE `NewTable` ( `NewTableKEY` INT NOT NULL AUTO_INCREMENT ,
      `NewTableTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`NewTableKEY`));


这将在执行UPDATE查询时自动更新时间戳。 DEFAULT只适合插入语句,但是如果指定ON UPDATE,MySQL会自动更新字段值(无需编码)

有关更多详细信息,请参见[https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html]。

希望这可以帮助

如果您想根据自己的条件进行更新,请编写自己的代码或使用触发器,如下所示,

CREATE TRIGGER _triggerName AFTER UPDATE ON _tableName FOR EACH ROW
BEGIN
    -- Your conditions
    -- Your queries Based on the conditions
END;

关于mysql - 我可以在MySQL的UPDATE命令中使用DEFAULT设置时间戳吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56461273/

10-14 10:23
查看更多