【问题标题】:MySQL is not allowing ON UPDATE CURRENT_TIMESTAMP for a DATETIME fieldMySQL 不允许对 DATETIME 字段进行 ON UPDATE CURRENT_TIMESTAMP
【发布时间】:2019-09-14 05:27:44
【问题描述】:

我已经看过很多相关的问题,但我无法解决这个具体问题:

我有一个 MySQL 表,其中包含一个 TIMESTAMP(用于创建字段的时间)和一个 DATETIME(用于每次更新该字段的时间)。它看起来像这样:

CREATE TABLE 'vis' (
ID BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL,
ENTRY VARCHAR(255),
AUTHOR VARCHAR(255),
CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UPDATED_AT DATETIME ON UPDATE CURRENT_TIMESTAMP,
UPDATED_BY VARCHAR(255)
)

当我尝试这个时,我得到的错误是:(SQL Error: 1294 SQL State: HY000) - Invalid ON UPDATE clause for 'updated_at' field

我读过的所有地方(甚至在 Stack Overflow 上)都表明我应该能够做到这一点,但我收到了这个错误。也许还有另一种方法可以让一个字段在我每次更新时自动更新时间?

我正在使用 MySQL 服务器 5.5。

【问题讨论】:

    标签: mysql datetime timestamp


    【解决方案1】:

    DATETIME 不能在更新时使用 CURRENT_TIMESTAMP。相反,请将其更改为 TIMESTAMP

    或者,考虑在这种情况下使用触发器:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

    编辑:就像在 cmets 中一样(感谢@АлександрФишер!),自 MySQL 5.6.5 以来不再是这种情况,因此另一种解决方案是尽可能升级您的服务器。

    【讨论】:

    • 这完全有效,谢谢!我在表声明中去掉了ON UPDATE CURRENT TIMESTAMP,然后在创建表后处理了这个语法:CREATE TRIGGER 'vis_update_entry' BEFORE UPDATE ON 'vis' FOR EACH ROW SET NEW.updated_at = CURRENT_TIMESTAMP 现在每次更新该特定行时它都会更新。故事的寓意:网上任何地方都说您可以执行两个 TIMESTAMPS 或一个 DATETIME 且 ON UPDATE 是 FALSE! 至少对于 MySQL Server 5.5。
    • @MichaelPlautz - 总是很高兴看到“谢谢,我用你的资源解决了它”而不是“好的,但我需要代码来在触发器上执行此操作”,谢谢 :)
    • 使用的版本似乎很重要。文档说如果使用 MySQL 5.6 版它应该可以工作:dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html。我无法确认,因为我的服务器运行 5.1 :(
    • 对于新访问者:正如@АлександрФишер 所述,这取决于您使用的 MySQL 版本。从 5.6 版本开始,您可以在 DATETIME 和 TIMESTAMP 上使用 CURRENT_TIMESTAMP
    • 而不仅仅是ON UPDATE CURRENT_TIMESTAMP,您应该始终使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 以使其更准确,而不是空白时间戳
    【解决方案2】:

    该功能似乎已在 5.6 中引入。在我的默认 OS X 安装上按预期工作。

    参考:Automatic Timestamp Properties Before MySQL 5.6.5

    【讨论】:

      【解决方案3】:

      MySQL 不允许将函数用于默认的DateTime 值。 (参见 MySQL 数据类型Defaults。)

      【讨论】:

        【解决方案4】:

        自动插入和更新日期/时间

        适用于数据类型:DATETIME 或 TIMESTAMP

        测试于:MySQL 5.6.27-2 和 MariaDB 10.1.10


        INSERT

        上存储当前日期和时间
        CREATE TABLE table_demo (
            ...
            `CreatedAt` datetime DEFAULT CURRENT_TIMESTAMP
            ...
        );
        

        INSERTUPDATE

        上存储当前日期和时间
        CREATE TABLE table_demo (
            ...
            `UpdatedAt` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            ... 
        );
        

        仅在 UPDATE

        时存储当前日期和时间

        注意:INSERT 时,默认值为 '0000-00-00 00:00:00'

        CREATE TABLE table_demo (
            ...
            `UpdatedAt` datetime DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP
            ...
        );
        

        【讨论】:

        • 这不是回答问题
        【解决方案5】:

        是的,如果您将其更改为 timestamp ,既没有 DEFAULT CURRENT_TIMESTAMP 也没有 ON UPDATE CURRENT_TIMESTAMP,这与同时指定 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 相同。

        【讨论】:

        • 请澄清:没有任何修饰符,它会自动默认和更新?
        【解决方案6】:

        TIMESTAMP 和(从 MySQL 5.6.5 开始)DATETIME 数据类型提供自动初始化和更新到当前日期和时间。如需更多信息,请参阅Section 11.3.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME”

        【讨论】:

          【解决方案7】:

          看我的照片。

          设置列归档类型时间戳,属性更新 CURRENT_TIMESTAMP 和 Extra 也。在我的情况下,更改数据库中的文件类型后没有问题。但不确定是否适用于所有情况。

          【讨论】:

            猜你喜欢
            • 2011-07-31
            • 2016-05-30
            • 2011-09-29
            • 2020-03-03
            • 2012-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-26
            相关资源
            最近更新 更多