关于mysql:是否可以定义一个非空的时间戳列,并且在更新时没有默认值且没有特殊行为?

Is it possible to define a timestamp column that is not null and has no default and no special behavior on update?

当我创建一个带有timestamp列的表时,该列在更新CURRENT_TIMESTAMP时被神奇地定义为NOT NULL DEFAULT CURRENT_TIMESTAMP。 忽略到目前为止这有多奇怪,我想将其更改为没有默认值,也没有特殊的"on update"行为。

我发现如果我将列更改为NULL,默认情况下会神奇地设置为NULL,并且"on update"会神奇地消失。 这很好,但我希望列不是NULL。 当我将其更改回来时,默认和"on update"(设置为CURRENT_TIMESTAMP)都会神奇地重新出现。

我知道我可以使用datetime而不是timestamp,但我对时间戳感兴趣,因为它是时区感知的(似乎就像Postgres中的"timestamp with time zone")。


时间戳列是一种特殊情况。 请参见此处:默认情况下,TIMESTAMP列为NOT NULL,不能包含NULL值,而赋值NULL则指定当前时间戳。

有关更详细的信息,请阅读数据类型默认值。

特别是当不在严格模式下运行时,这种情况适用。 如果在严格模式下运行,插入NULL将引发错误。

这应该照顾它:

1
ALTER TABLE tableName ALTER COLUMN columnName DROP DEFAULT;

如果这不起作用,执行此操作应该保留默认值(轻松覆盖)但删除ON UPDATE:

1
ALTER TABLE tableName CHANGE columnName columnName NOT NULL DEFAULT CURRENT_TIMESTAMP;

请注意重复的列名称。


这是一个可能的解决方法:
禁用ON UPDATE

基本上,您可以将ts设置为其原始值:

UPDATE woot SET col=, ts=ts;