timestamp类型在not null时可以插入null值?

本文探讨了在RDS MySQL 5.6环境下,timestamp字段设置为not null并处于严格模式时,为何能插入空值而不触发错误。通过对比自建数据库与RDS环境,发现explicit_defaults_for_timestamp变量的设置差异是关键原因。
摘要由CSDN通过智能技术生成

背景

有同学问在RDS MySQL 5.6在timestamp 设置为 not null 并且SQL模式是严格模式时,仍然可以插入空值,理论上应该有报错,是不是RDS的bug?

环境

MySQL 5.6 5.7 8.0,在RDS和自建数据库上都会遇到

现象

image
从上图中可以看到,在timestamp设置为not null时会自动补齐:

DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在客户的自建环境中timestamp类型没有自动补齐,在严格模式下会报错;
在RDS MySQL的环境中datetime类型没有自动补齐,,在严格模式下会报错:
image

溯源

If the explicit_defaults_for_timestamp system variable is disabled, TIMESTAMP columns by default are NOT NULL, cannot contain NULL values, and assigning NULL assigns the current timestamp. To permit a TIMESTAMP column to contain NULL, explicitly declare it with the NULL attribute. In this case, the default value also becomes NULL unless overridden with a DEFAULT clause that specifies a different default value. DEFAULT NULL can be used to explicitly specify NULL as the default value. (For a TIMESTAMP column not declared with the NULL attribute, DEFAULT NULL is invalid.) If a TIMESTAMP column permits NULL values, assigning NULL sets it to NULL, not to the current timestamp.
在explicit_defaults_for_timestamp值为OFF时,会自动补齐上文中的内容,而客户的环境里面explicit_defaults_for_timestamp是ON的,所以跟RDS MySQL结果有差异,跟客户说过后,验证就是explicit_defaults_for_timestamp值差异导致。

结论

每一件不合理的事情背后,必然有一个自己还未了解的合理原因.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值