【问题标题】:MySQL CURRENT_TIMESTAMP on create and on updateMySQL CURRENT_TIMESTAMP 在创建和更新时
【发布时间】:2011-06-21 06:51:58
【问题描述】:

我想定义有 2 个 TIMESTAMP 字段的表,如下所示:

CREATE TABLE `msgs` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `msg` VARCHAR(256),
    `ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

如何避免错误:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

重点是在表架构中保持ts_createts_update 的期望行为。

【问题讨论】:

标签: mysql timestamp mysql-error-1293


【解决方案1】:

你可以试试这个 ts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ts_update TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP

【讨论】:

    【解决方案2】:

    这是Mysql在旧版本中的微小限制,实际上在5.6及更高版本之后多个时间戳有效......

    【讨论】:

      【解决方案3】:

      猜这是一篇旧帖子,但实际上我猜 mysql 在其最新版本 mysql 5.6.25 中支持 2 TIMESTAMP,这就是我现在使用的。

      【讨论】:

        【解决方案4】:

        您正在使用旧的 MySql 版本。将你的 myqsl 更新到 5.6.5+ 就可以了。

        【讨论】:

        • 问题是从 2011 年开始的,当时 MySQL 5 是全新的。
        【解决方案5】:

        我认为使用以下技术是可能的

        `ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
        

        【讨论】:

        • '0000-00-00 00:00:00' 不是有效的时间戳,虽然 mysql 允许,但许多其他数据库默认不允许 '0000-00-00 00:00:00'到时间戳数据类型,所以在某些时候,如果你从 mysql 迁移出来,这会很痛苦。
        • 这在 MySQL 中实际上也很痛苦,您不应该使用零来初始化时间戳或日期/时间列。
        • 是否允许零作为有效时间戳取决于当前的 SQL 模式。文档:dev.mysql.com/doc/refman/5.5/en/…
        【解决方案6】:

        您的表上不能有两个具有相同默认值 CURRENT_TIMESTAMP 的 TIMESTAMP 列。请参考此链接:http://www.mysqltutorial.org/mysql-timestamp.aspx

        【讨论】:

          【解决方案7】:

          我会说你不需要在你的 ts_update 上有 DEFAULT CURRENT_TIMESTAMP:如果它是空的,那么它不会被更新,所以你的“最后一次更新”是 ts_create。

          【讨论】:

          • 如果你有另一个字段,TIMESTAMP 在 DEFAULT,你就不能有 ON UPDATE TIMESTAMP
          • 我知道。但问题不是“为什么会发生这种情况”,而是“我怎样才能避免它”。这回答了我认为比“更改数据类型并触发触发器”更好的问题。
          【解决方案8】:

          我想您可能希望 ts_create 作为日期时间(所以重命名 -> dt_create)并且只希望 ts_update 作为时间戳?这将确保它在设置后保持不变。

          我的理解是 datetime 是用于手动控制的值,timestamp 有点“特殊”,因为 MySQL 会为您维护它。在这种情况下,日期时间因此是 ts_create 的一个不错的选择。

          【讨论】:

            猜你喜欢
            • 2012-12-30
            • 2013-09-13
            • 2012-11-20
            • 2011-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多