2

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

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

ALTER TABLE myTable ALTER COLUMN ts2 DROP DEFAULT

执行此操作后,ts2将默认为CURRENT_TIMESTAMP,也将默认为ts1

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

4

1 回答 1

1

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

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

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

据推测,您的插入是在列列表中按名称指定该时间戳列,并且您在其中显式插入一个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。取消了对每个表单个自动时间戳列的限制,并且时间戳列还支持可选的毫秒和微秒粒度。

于 2013-10-03T00:53:09.427 回答