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将引发错误。
这应该照顾它:
如果这不起作用,执行此操作应该保留默认值(轻松覆盖)但删除ON UPDATE:
请注意重复的列名称。
-
嗯,有趣。我能够做到这一点:alter table tstest modify ts timestamp not null default 0;然后:alter table tstest alter column ts drop default;这似乎给出了我想要的结果。我想知道是否有更直接的方法,理想情况下在create table语句中。
-
所以现在我可以分2步完成:创建表(默认为0)然后删除默认值。但奇怪的是,如果我尝试插入一个空值,它仍然使用当前时间戳(如果我没有指定一个值,它使用0)。 mysql,你没有意义吗?
-
这似乎是一个特例。请参见此处:默认情况下,TIMESTAMP列为NOT NULL,不能包含NULL值,而赋值NULL则指定当前时间戳。
-
此外,它听起来你没有在严格模式下运行。看到这个是为了真正理解发生了什么:dev.mysql.com/doc/refman/5.1/en/data-type-defaults.html
-
默认情况下,是的,但即使更改了默认值,"分配NULL"部分似乎仍然成立。
-
是的,由于not null子句和(可能)不在严格模式下运行,您正在处理一些隐式默认行为。
-
我将sql模式切换为传统模式,并且CURRENT_TIMESTAMP默认值仍然有效(尽管我删除了它)。我猜它是硬编码的。无论如何,谢谢你的回答。
-
请问OP请选择这个答案是否正确?
-
@MirroredFate如果Ilion编辑它以包含评论中讨论的其他细节,我会接受它 - 尤其是无法避免CURRENT_TIMESTAMP有效默认值的事实
-
@aditsu信息补充说。
-
我不认为你写的是正确的。我在严格模式下插入null并且没有错误。
这是一个可能的解决方法:
禁用ON UPDATE
基本上,您可以将ts设置为其原始值:
UPDATE woot SET col=, ts=ts;