【问题标题】:Can I use DEFAULT to set a Timestamp in an UPDATE command in MySQL?我可以使用 DEFAULT 在 MySQL 的 UPDATE 命令中设置时间戳吗?
【发布时间】:2019-10-21 00:15:00
【问题描述】:

我的托管服务提供商昨天更新了我们的 MySQL,现在我网站的重要部分无法正常运行。经过调查,我发现任何指定 Timestamp 应设置为 DEFAULT 的 UPDATE 命令都无法更新 Timestamp。这是一个已经完美运行了2年的网站。新的 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 效果很好。我还发现“on update CURRENT_TIMESTAMP”功能按预期工作。

据我了解,在 UPDATE 命令中使用 DEFAULT 是正确的语法(并且已经使用了多年)。我使用了错误的语法吗?是否已弃用此语法?如果是这样,正确的语法是什么?

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    将您的表定义更改为以下内容

    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只迎合insert语句,但如果你指定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;
    

    【讨论】:

    • 谢谢,但我不希望时间戳在表更新时更新,只有在我告诉它时才更新。
    • 在这种情况下,要么编写您自己的代码,要么编写一个TRIGGER,它可以根据您的条件进行更新;尝试使用CREATE TRIGGER _triggerName AFTER UPDATE ON _tableName FOR EACH ROW BEGIN -- Your conditions -- Your queries Based on the conditions END;
    • 更新了答案,使代码看起来正确以提高可读性。希望对你有帮助。
    • 谢谢。我可以重写它,但我真正想知道的是为什么我一直在使用的功能不再起作用(或者更确切地说,在新版本的 MySQL 中该功能的正确语法是什么?)。还是刚刚删除了这个功能?
    • 我刚刚尝试在所有这些命令中将 DEFAULT 更改为 NULL 并且效果很好,但我担心前向兼容性,因为据我了解 DEFAULT 是正确的语法,而 NULL 不是。
    猜你喜欢
    • 2023-04-06
    • 2015-08-31
    • 1970-01-01
    • 2011-10-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多