【问题标题】:Workaround for only one Mysql CURRENT_TIMESTAMP只有一个 Mysql CURRENT_TIMESTAMP 的解决方法
【发布时间】:2013-10-02 21:24:31
【问题描述】:

所以MySQL 将只允许单个字段使用CURRENT_TIMESTAMP 作为默认值。我最近(并且意外地)按照here 的说明发现了一个解决方法。

基本上,创建一个表myTable,其中有一个Timestamp 列(ts1),默认使用CURRENT_TIMESTAMP,还有一个默认为0 的(ts2)。然后运行

ALTER TABLE myTable ALTER COLUMN ts2 DROP DEFAULT

完成此操作后,ts2 将默认为 CURRENT_TIMESTAMPts1 也是如此。

谁能解释这里的幕后情况?这最终会导致问题和破坏吗?

【问题讨论】:

  • 在您执行此操作后,DESCRIBE tbl 会告诉您有关 ts1ts2 的哪些信息?
  • 好问题!它说 ts1 不是NULL,默认为CURRENT_TIMESTAMP,而ts2 不是NULL,默认为NULL

标签: mysql timestamp


【解决方案1】:

这种行为并不像看起来那样令人毛骨悚然。

此外,您可以将 任何 TIMESTAMP 列初始化或更新为当前日期和时间,方法是为其分配一个NULL 值,除非它已使用NULL 属性定义以允许@ 987654323@ 值。

通过从TIMESTAMP(即NOT NULL)中删除默认的“0”,您插入的是当前时间戳而不是全零占位符。

据推测,您的插入是在列列表中按名称指定时间戳列,并且您在此处显式插入 NULL,仅触发未完全配置为任何人意图的记录行为柱子。所以,不,不要使用这个。

我说“大概”是因为如果我没有明确列出该列,我会得到:

mysql> show warnings;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1364 | Field 'ts2' doesn't have a default value |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

...和我的 NOT NULL(无默认值)第二个时间戳初始化为全 0 的值。

如果您不这样做,那么我很想知道您的特定 MySQL 服务器版本。

不过,无论如何,如果您需要更灵活的时间戳,请升级到 MySQL 5.6。取消了对每个表单个自动时间戳列的限制,并且时间戳列还支持可选的毫秒和微秒粒度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-17
    • 2012-01-27
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多