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

当我创建一个带有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;

链接已经死了。

我刚刚更新了它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值