我的托管服务提供商昨天更新了我们的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/